Исследование продаж компьютерных игр¶

Компьютерные игры стали популярным видом игровой деятельности и наиболее выгодным коммерческим продуктом на современном рынке.

Индустрия компьютерных игр — часть современной мировой экономики. Это совокупность различных компаний, сообществ и отдельных личностей, а также технологий и процессов, которые вместе образуют полный цикл производства (разработка, продажа, продвижение, потребление) компьютерных игр. Конкурентное преимущество рынка компьютерных игр заключается в том, что он менее других секторов экономики подвержен внезапным колебаниям.

С развитием интернета вырос интерес и к международной электронной торговле. Сейчас продукт (с помощью множества сервисов) можно приобрести из любой точки мира, имеющей доступ к интернету.

Интернет-магазин компьютерных игр — это электронная площадка (онлайн-ресурс), на котором можно приобрести цифровые копии компьютерных игр. Такие магазины обеспечивают быстрый и удобный доступ к играм. Они могут предлагать к продаже ключи для активации игр или ссылки для скачивания игр. Обычно в таких магазинах можно найти широкий ассортимент игр для различных платформ (персонального компьютера, игровых консолей, мобильных устройств). Оплата за игры может осуществляться различными электронными способами, включая использование банковских карт и электронных кошельков. А если обеспечить англоязычную поддержку и сервис, то можно продавать компьютерные игры по всему миру.

Чтобы интернет-магазин приносил прибыль, необходимо разработать эффективную стратегию его продвижения и спланировать маркетинговые мероприятия. Прежде всего нужно сделать ставку на потенциально популярный и успешный продукт.

Потенциально популярный продукт — это товар, который может стать популярным в будущем. Для выявления такого продукта и прогнозирования продаж необходимо проанализировать объём рынка и спрос, понять, какие компьютерные игры востребованы на рынке и кто является лидером продаж — найти бестселлеры. Важно отличаться от конкурентов, поэтому необходимо сделать правильный выбор целевой аудитории и предложить ей что-то новое и интересное.

Успешность компьютерной игры может оцениваться по различным критериям, включая количество проданных копий, популярность в онлайн-сообществах, критические отзывы и рейтинги.

Для прогнозирования продаж компьютерных игр и подбора факторов влияния на продажи нужно:

  • Проанализировать данные о продаже предыдущих компьютерных игр:
    • составить базу данных по продаже компьютерных игр за предыдущие годы;
    • выявить динамику продаж по годам и в связи с различными событиями (например, выходом новых консолей);
    • выявить актуальный для анализа период;
    • определить популярные жанры и платформы.
  • Проанализировать оценки критиков и пользователей и рейтинги организаций:
    • выявить наличие оценки и/или присвоенного рейтинга;
    • проанализировать значение оценки;
    • на основе присвоенного рейтинга выявить потенциальную аудиторию.

Для проведения анализа необходимы данные. Такие данные можно получить из открытых источников.

Открытые источники, собирающие данные о продажах компьютерных игр, — это ресурсы, на которых публикуются данные о количестве проданных экземпляров игр, их доходности, рейтингах популярности и других характеристиках. Такие источники позволяют отслеживать динамику продаж и успех игр от разных издателей и разработчиков, а также проводить анализ рынка компьютерных игр.

В нашем распоряжении находятся данные о продажах игр до 2016 года в различных регионах мира, полученные из открытых источников. По каждой проданной игре доступны данные о выпуске игры, о жанрах и платформах, информация об объёме продаж в регионах, а также экспертные и пользовательские оценки и рейтинг, присвоенный ESRB.

Цель исследования: выявить признаки, определяющие успешность компьютерной игры.

Задачи исследования:

  • выполнить предобработку данных;
  • изучить обработанные данные;
  • найти особенности и выявить зависимости между признаками;
  • выдвинуть и проверить гипотезы.

Содержание

  • 1  Обзор данных
    • 1.1  Импорт библиотек и предварительные настройки
    • 1.2  Чтение файла и загрузка данных
    • 1.3  Общая характеристика набора данных
    • 1.4  Преобразование наименований признаков
  • 2  Понимание данных
  • 3  Описание данных
    • 3.1  Признаки, измеряемые в шкале отношений, абсолютной и интервальной шкалах
    • 3.2  Признаки, измеряемые в номинальной шкале
  • 4  Предобработка данных
    • 4.1  Обработка текстовых значений и извлечение вложенных сведений
      • 4.1.1  Жанр компьютерной игры
      • 4.1.2  Рейтинг пользователей
      • 4.1.3  Название компьютерной игры
      • 4.1.4  Название платформы
      • 4.1.5  Категории рейтинга ESRB
    • 4.2  Обработка аномальных и несогласованных значений
      • 4.2.1  Информация о сроках продаж в названии игры
      • 4.2.2  Информация о регионах продаж в названии игры
      • 4.2.3  Согласование значений года выпуска и названия платформы
      • 4.2.4  Категории рейтинга ESRB
    • 4.3  Обработка пропусков
      • 4.3.1  Год выпуска
    • 4.4  Изменение типов данных
    • 4.5  Обработка дубликатов
    • 4.6  Обработка пропусков (продолжение)
      • 4.6.1  Рейтинги критиков и пользователей
      • 4.6.2  Категории рейтинга ESRB
    • 4.7  Обогащение данных
      • 4.7.1  Создание производных признаков
      • 4.7.2  Категоризация данных
  • 5  Исследовательский анализ данных
    • 5.1  Описательный анализ данных
      • 5.1.1  Характеристики компьютерных игр
        • 5.1.1.1  Название игры
        • 5.1.1.2  Год выпуска игры
        • 5.1.1.3  Название платформы
        • 5.1.1.4  Поколения игровых систем
        • 5.1.1.5  Производитель платформ
        • 5.1.1.6  Жанр игры
      • 5.1.2  Характеристики оценок
        • 5.1.2.1  Оценка пользователей
        • 5.1.2.2  Оценка критиков
        • 5.1.2.3  Рейтинг ESRB и возрастные категории
      • 5.1.3  Характеристики продаж
        • 5.1.3.1  Общие (мировые) продажи
        • 5.1.3.2  Продажи в Северной Америке
        • 5.1.3.3  Продажи в Европе
        • 5.1.3.4  Продажи в Японии
        • 5.1.3.5  Продажи в других регионах
  • 6  Корреляционный анализ данных
    • 6.1  Игровые платформы
    • 6.2  Выделение в данных актуального периода
      • 6.2.1  Платформы производства Sony
      • 6.2.2  Платформы производства Nintendo
      • 6.2.3  Платформы производства Microsoft
      • 6.2.4  Персональный компьютер как игровая платформа
    • 6.3  Анализ данных за актуальный период
      • 6.3.1  Распределение продаж игр по платформам
      • 6.3.2  Влияние оценок пользователей и критиков
        • 6.3.2.1  Sony PlayStation 4
        • 6.3.2.2  Sony PlayStation Vita
        • 6.3.2.3  Nintendo WiiU
        • 6.3.2.4  Nintendo 3DS
        • 6.3.2.5  Microsoft Xbox One
        • 6.3.2.6  Персональный компьютер
        • 6.3.2.7  Корреляция оценок критиков и пользователей
      • 6.3.3  Распределение игр по жанрам
      • 6.3.4  Распределение предпочтений по регионам
        • 6.3.4.1  Пользователь из Северной Америки
        • 6.3.4.2  Пользователь из Европы
        • 6.3.4.3  Пользователь из Японии
        • 6.3.4.4  Пользователь из других регионов
  • 7  Проверка гипотез
    • 7.1  Сравнение оценок платформы Xbox One и персонального компьютера
    • 7.2  Сравнение оценок жанров экшен и спортивные игры
  • 8  Общий вывод

Обзор данных¶

Импорт библиотек и предварительные настройки¶

In [1]:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import sys
import os
import warnings

from scipy import stats as st

pd.set_option('display.max_columns', None)
np.set_printoptions(threshold=sys.maxsize)
warnings.filterwarnings('ignore')

Чтение файла и загрузка данных¶

Все данные хранятся в одном файле.
Файл данных games.csv имеет формат CSV.

In [2]:
pth1 = r'C:\Users\Георгий\Documents\DS_projects\games.csv'
pth2 = '/datasets/games.csv'
pth3 = '/content/games.csv'

if os.path.exists(pth1):
    data = pd.read_csv(pth1)
elif os.path.exists(pth2):
    data = pd.read_csv(pth2)
elif os.path.exists(pth3):
    data = pd.read_csv(pth3)
else:
    print('Something is wrong')

Убедимся, что данные подгрузились верно, без ошибок.

Для этого выведем первые 10 строк и последние 10 строк набора данных.

In [3]:
data.head(10)
Out[3]:
Name Platform Year_of_Release Genre NA_sales EU_sales JP_sales Other_sales Critic_Score User_Score Rating
0 Wii Sports Wii 2006.0 Sports 41.36 28.96 3.77 8.45 76.0 8 E
1 Super Mario Bros. NES 1985.0 Platform 29.08 3.58 6.81 0.77 NaN NaN NaN
2 Mario Kart Wii Wii 2008.0 Racing 15.68 12.76 3.79 3.29 82.0 8.3 E
3 Wii Sports Resort Wii 2009.0 Sports 15.61 10.93 3.28 2.95 80.0 8 E
4 Pokemon Red/Pokemon Blue GB 1996.0 Role-Playing 11.27 8.89 10.22 1.00 NaN NaN NaN
5 Tetris GB 1989.0 Puzzle 23.20 2.26 4.22 0.58 NaN NaN NaN
6 New Super Mario Bros. DS 2006.0 Platform 11.28 9.14 6.50 2.88 89.0 8.5 E
7 Wii Play Wii 2006.0 Misc 13.96 9.18 2.93 2.84 58.0 6.6 E
8 New Super Mario Bros. Wii Wii 2009.0 Platform 14.44 6.94 4.70 2.24 87.0 8.4 E
9 Duck Hunt NES 1984.0 Shooter 26.93 0.63 0.28 0.47 NaN NaN NaN
In [4]:
data.tail(10)
Out[4]:
Name Platform Year_of_Release Genre NA_sales EU_sales JP_sales Other_sales Critic_Score User_Score Rating
16705 15 Days PC 2009.0 Adventure 0.00 0.01 0.00 0.0 63.0 5.8 NaN
16706 Men in Black II: Alien Escape GC 2003.0 Shooter 0.01 0.00 0.00 0.0 NaN tbd T
16707 Aiyoku no Eustia PSV 2014.0 Misc 0.00 0.00 0.01 0.0 NaN NaN NaN
16708 Woody Woodpecker in Crazy Castle 5 GBA 2002.0 Platform 0.01 0.00 0.00 0.0 NaN NaN NaN
16709 SCORE International Baja 1000: The Official Game PS2 2008.0 Racing 0.00 0.00 0.00 0.0 NaN NaN NaN
16710 Samurai Warriors: Sanada Maru PS3 2016.0 Action 0.00 0.00 0.01 0.0 NaN NaN NaN
16711 LMA Manager 2007 X360 2006.0 Sports 0.00 0.01 0.00 0.0 NaN NaN NaN
16712 Haitaka no Psychedelica PSV 2016.0 Adventure 0.00 0.00 0.01 0.0 NaN NaN NaN
16713 Spirits & Spells GBA 2003.0 Platform 0.01 0.00 0.00 0.0 NaN NaN NaN
16714 Winning Post 8 2016 PSV 2016.0 Simulation 0.00 0.00 0.01 0.0 NaN NaN NaN

Общая характеристика набора данных¶

Размер набора данных:

In [5]:
data.shape
Out[5]:
(16715, 11)

Количество дубликатов в наименованиях признаков:

In [6]:
data.columns.duplicated().sum()
Out[6]:
0

Уникальные наименования признаков:

In [7]:
data.columns.sort_values().tolist()
Out[7]:
['Critic_Score',
 'EU_sales',
 'Genre',
 'JP_sales',
 'NA_sales',
 'Name',
 'Other_sales',
 'Platform',
 'Rating',
 'User_Score',
 'Year_of_Release']

Количество элементов данных:

In [8]:
data.size
Out[8]:
183865

Типы данных набора данных:

In [9]:
data.dtypes.value_counts()
Out[9]:
float64    6
object     5
dtype: int64

Пропущенные значения в данных:

In [10]:
data.isna().sum().sort_values()
Out[10]:
Platform              0
NA_sales              0
EU_sales              0
JP_sales              0
Other_sales           0
Name                  2
Genre                 2
Year_of_Release     269
User_Score         6701
Rating             6766
Critic_Score       8578
dtype: int64

Распределение пропущенных значений в наборе данных:

In [11]:
sns.heatmap(data.isna(), cmap=sns.color_palette(['#000000', '#ffffff']))
plt.title('Тепловая карта распределения пропущенных значений')
plt.xlabel('Название признака')
plt.ylabel('Номер записи')
plt.show()

Количество признаков без пропущенных значений:

In [12]:
(data.isna().sum() == 0).sum()
Out[12]:
5

Общее количество пропущенных значений:

In [13]:
data.isna().sum().sum()
Out[13]:
22318

Промежуточный вывод

  • Набор данных содержит 11 уникальных признаков и 16 715 записей.
  • Всего: 183 865 элементов данных.
  • Набор данных содержит данные следующего типа:
    • вещественный — 6 признаков,
    • смешанного типа — 5 признаков.
  • Все признаки содержат значения (не являются пустыми).
  • 5 признаков не содержат пропущенные значения.
  • 6 признаков содержат пропущенные значения:
    • распределение пропусков в данных не носит регулярный характер,
    • всего в данных 22 318 пропущенных значений — около 12 % от всех элементов данных.
  • Необходимо привести названия признаков к "змеиному_регистру".

Преобразование наименований признаков¶

Приведение названий столбцов к нижнему регистру.

In [14]:
data.columns = data.columns.str.lower()
data.columns.tolist()
Out[14]:
['name',
 'platform',
 'year_of_release',
 'genre',
 'na_sales',
 'eu_sales',
 'jp_sales',
 'other_sales',
 'critic_score',
 'user_score',
 'rating']
In [15]:
data.head()
Out[15]:
name platform year_of_release genre na_sales eu_sales jp_sales other_sales critic_score user_score rating
0 Wii Sports Wii 2006.0 Sports 41.36 28.96 3.77 8.45 76.0 8 E
1 Super Mario Bros. NES 1985.0 Platform 29.08 3.58 6.81 0.77 NaN NaN NaN
2 Mario Kart Wii Wii 2008.0 Racing 15.68 12.76 3.79 3.29 82.0 8.3 E
3 Wii Sports Resort Wii 2009.0 Sports 15.61 10.93 3.28 2.95 80.0 8 E
4 Pokemon Red/Pokemon Blue GB 1996.0 Role-Playing 11.27 8.89 10.22 1.00 NaN NaN NaN

Понимание данных¶

По своему содержанию все данные можно разделить на несколько категорий:

  • Признаки, характеризующие компьютерную игру.
  • Признаки, характеризующие объём продаж компьютерных игр.
  • Признаки, относящиеся к оценке компьютерных игр.

*Характеристики компьютерных игр*

С точки зрения действующего правового регулирования специфические черты компьютерной игры позволяют отнести её к разновидности компьютерной программы/программы для электронно-вычислительных машин (ЭВМ) либо к разновидности мультимедийной продукции.

Компьютерная игра — разновидность мультимедийного продукта, представляющего собой комплексное синтетическое произведение, созданное на особом уровне сотрудничества коллектива авторов.


Компьютерная игра — техническая игра, в которой игровое поле находится под управлением ЭВМ или воспроизводится на экране дисплея.
Компьютерная игра — компьютерная программа, служащая для организации игрового процесса (геймплея), связи с партнёрами по игре, или сама выступающая в качестве партнёра.

Для создания уникальной идентичности компьютерной игры и облегчения её поиска и распространения среди пользователей игре необходимо давать название.

Название игры — это уникальное имя (словесное обозначение) компьютерной игры, по которому её можно идентифицировать и выделить из множества всех компьютерных игр.

Варианты названий компьютерных игр ограничены только фантазией разработчиков. Название может отражать основной сюжет и цель игры. Оно может содержать ключевые слова или фразы, которые помогают пользователям понять суть игры. Кроме того, некоторые игры могут иметь подзаголовки или дополнительные обозначения, указывающие на жанр, платформу, год выпуска.

name — название компьютерной игры
Признак является категориальным, номинальным.
Шкала измерения признака: номинальная шкала.

Год выпуска игры — это год, когда компьютерная игра была разработана и выпущена на рынок.

Это важная информация для игроков, так как она позволяет определить, насколько игра старая или новая, и как она соотносится с современными стандартами качества компьютерных игр. Также по году выпуска пользователь может определять совместимость игры с операционной системой и техническими характеристиками компьютера или игровой консоли.

year_of_release — год выпуска компьютерной игры
Признак является количественным, дискретным.
Шкала измерения признака: интервальная шкала.

Современные компьютерные игры, как правило, издаются несколько раз: для разных стран и регионов мира, а также для разных платформ.

Игровые платформы — аппаратно-программные системы, используемые для запуска, управления и игры в компьютерные игры.

Все игровые платформы имеют свои особенности, некоторые из которых включают в себя разные виды графики, звука и множество других функций. Каждая платформа имеет свои уникальные игры и совместимость с различными аксессуарами, которые могут варьироваться в зависимости от платформы.

Среди основных видов игровых платформ можно выделить:

  • персональные компьютеры (на базе Windows, Mac/OS X или Linux);
  • игровые консоли (специализированные устройства для игр).

Кроме того, существуют и другие виды игровых платформ:

  • мобильные устройства (iOS, Android, Windows);
  • универсальные web-платформы, социальные сети (FB, VK);
  • аркадные автоматы;
  • инновационные платформы виртуальной реальности.

Personal computer (PC) — персональный компьютер.

Игровая приставка (игровая консоль) — специализированное электронное устройство, предназначенное для видеоигр. Для таких устройств, в отличие от персональных компьютеров, запуск и воспроизведение видеоигр является основной задачей.

Портативная игровая система (портативная игровая приставка) — лёгкое, компактное, портативное электронное устройство, предназначенное для того, чтобы играть в видеоигры. От игровых приставок (игровых консолей) такие устройства отличаются компактностью и мобильностью; игровой контроллер, экран и звуковоспроизводящие элементы, как правило, являются здесь частью самого устройства.

Портативные консоли и другие игровые системы часто группируются по годам выпуска, связанным с поколениями домашних консолей.

Поколения игровых систем — это группы игровых систем, выпущенных в определённый период времени и имеющих общие характеристики по техническим спецификациям или функциональности. Игровые системы делятся на поколения, чтобы облегчить сравнение их возможностей и продолжительности жизненного цикла.

Поколения различаются по многим параметрам, например, по процессору, графике, звуковой поддержке, способности к сетевым функциям и т. д. Игровые разработчики учитывают различия между поколениями при создании и оптимизации игр для консолей.

Второе поколение игровых систем (1976–1984)

Atari 2600 (2600) — игровая приставка производства Atari (США). Выпущена в 1977 г. Поддержка прекращена в 1992 г.

Третье поколение игровых систем (1983–1992)

Nintendo Entertainment System (NES) — игровая приставка производства Nintendo (Япония). Выпущена в 1983 г. Поддержка прекращена в 2003 г.

Четвёртое поколение игровых систем (1987–1996)

Nintendo Game Boy (GB) — портативная игровая система производства Nintendo (Япония). Выпущена в 1989 г. Поддержка прекращена в 2003 г.

Sega Mega Drive/Genesis (GEN) — игровая приставка производства Sega (Япония). Выпущена в 1988 г. Поддержка прекращена в 1999 г.

Sega Game Gear (GG) — портативная игровая приставка производства Sega (Япония). Выпущена в 1990 г. Поддержка прекращена в 1997 г.

Super Nintendo Entertainment System (SNES) — игровая приставка производства Nintendo (Япония). Выпущена в 1990 г. Поддержка прекращена в 2005 г.

Neo Geo (NG) — игровая приставка производства SNK (Япония). Выпущена в 1990 г. Поддержка прекращена в 2007 г.

Sega Mega-CD (SCD) — дополнение к игровой приставке Sega Mega Drive производства Sega (Япония). Выпущена в 1991 г. Поддержка прекращена в 1996 г.

TurboGrafx-16 (TG16) — игровая приставка производства NEC (Япония). Выпущена в 1987 г. Поддержка прекращена в 1994 г.

Пятое поколение игровых систем (1993–2005)

3DO Interactive Multiplayer (3DO) — игровая приставка производства Panasonic, Sanyo, Creative и Goldstar (Япония—Южная Корея—Сингапур). Выпущена в 1993 г. Поддержка прекращена в 1996 г.

Nintendo 64 (N64) — игровая приставка производства Nintendo (Япония) совместно с Silicon Graphics (США). Выпущена в 1996 г. Поддержка прекращена в 2002 г.

PC-FX (PCFX) — игровая приставка производства NEC (Япония). Выпущена в 1994 г. Поддержка прекращена в 1998 г.

PlayStation (PS) — игровая приставка производства Sony (Япония). Выпущена в 1994 г. Поддержка прекращена в 2006 г.

Sega Saturn (SAT) — игровая приставка производства Sega (Япония). Выпущена в 1994 г. Поддержка прекращена в 2000 г.

WonderSwan (WS) — портативная игровая консоль производства Bandai (Япония). Выпущена в 1999 г. Поддержка прекращена в 2003 г.

Шестое поколение игровых систем (1998–2013)

Sega Dreamcast (DC) — игровая приставка производства Sega (Япония). Выпущена в 1998 г. Поддержка прекращена в 2001 г.

Game Boy Advance (GBA) — портативная игровая приставка производства Nintendo (Япония). Выпущена в 2001 г. Поддержка прекращена в 2008 г.

Nintendo GameCube (GC) — игровая приставка производства Nintendo (Япония). Выпущена в 2001 г. Поддержка прекращена в 2007 г.

PlayStation 2 (PS2) — игровая приставка производства Sony (Япония). Выпущена в 2000 г. Поддержка прекращена в 2013 г.

Xbox (XB) — игровая приставка производства Microsoft (США). Выпущена в 2001 г. Поддержка прекращена в 2009 г.

Седьмое поколение игровых систем (2004–2017)

Nintendo DS (DS) — портативная игровая консоль производства Nintendo (Япония). Выпущена в 2004 г. Поддержка прекращена в 2013 г.

PlayStation 3 (PS3) — игровая приставка производства Sony (Япония). Выпущена в 2006 г. Поддержка прекращена в 2017 г. в Японии, в 2016 г. в Северной Америке.

PlayStation Portable (PSP) — портативная игровая приставка производства Sony (Япония). Выпущена в 2004 г. Поддержка прекращена в 2014 г.

Wii (Wii) — игровая приставка производства Nintendo (Япония). Выпущена в 2006 г. Поддержка прекращена в 2013 г.

Xbox 360 (X360) — игровая приставка производства Microsoft (США). Выпущена в 2005 г. Поддержка прекращена в 2016 г.

Восьмое поколение игровых систем (2012–н.в.)

Nintendo 3DS (3DS) — портативная игровая приставка производства Nintendo (Япония). Выпущена в 2011 г. Поддержка прекращена в 2020 г.

PlayStation 4 (PS4) — игровая приставка производства Sony (Япония). Выпущена в 2013 г. Поддержка некоторых моделей прекращена в 2021 г.

PlayStation Vita (PSV) — портативная приставка производства Sony (Япония). Выпущена в 2011 г. Поддержка прекращена в 2019 г.

Wii U (WiiU) — игровая приставка производства Nintendo (Япония). Выпущена в 2012 г. Поддержка прекращена в 2017 г.

Xbox One (XOne) — игровая приставка производства Microsoft (США). Выпущена в 2013 г. Поддержка прекращена в 2020 г.

platform — название игровой платформы
Признак является категориальным, номинальным.
Шкала измерения признака: номинальная шкала.

Сегодня компьютерные игры фактически возводятся до уровня произведения искусства.

Жанр — род произведений в пределах какого-нибудь искусства, отличающийся особыми, только ему свойственными сюжетными, стилистическими признаками.

Одним из способов классификации компьютерных игр является деление их на жанры. Жанровая классификация появилась тогда, когда количество игр стало настолько большим, что игрокам требовалось быстрое и удобное средство для их описания и систематизации.

Вследствие того, что критерии принадлежности игры к тому или иному жанру не определены однозначно, в разных источниках данные о жанре конкретного проекта могут различаться. Тем не менее, существует консенсус, к которому пришли разработчики игр, что принадлежность игры к одному из основных жанров почти всегда можно определить однозначно.

Существуют игры с элементами нескольких жанров. Такие проекты причисляют либо к одному из жанров, который в игре является основным, либо сразу ко всем, присутствующим в игре, если они в равной мере составляют геймплей проекта.

Жанры игр могут подразделяться на поджанры.

Компьютерная ролевая игра (role-playing) — жанр компьютерных игр, подразумевающий контроль игрока над одним или несколькими персонажами, от лица которых игрок может совершать нарративные выборы.

Экшен ролевые игры (action) — поджанр компьютерных ролевых игр. К числу экшен относят такие ролевые игры, которые требовательны к физическим способностям игрока: зрительно-моторной координации, скорости реакции и т. д.

Шутер (shooter) — жанр компьютерных игр, основу игрового процесса которых составляет взаимодействие с внутриигровыми объектами посредством стрельбы в них.

Симулятор (simulation) — в этом компьютерном игровом жанре, геймер управляет объектами (машины, самолёты, лодки) или процессами (деятельностью или жизнью персонажа, города, мира).

Файтинг (fighting) — жанр компьютерных игр, имитирующих рукопашный бой малого числа персонажей в пределах ограниченного пространства, называемого ареной.

Платформер (platform) — игра, где персонаж, управляемый игроком, путешествует по игровому миру, переходя с платформы на платформу (прыгая над пропастями, переплывая реки, карабкаясь на стены) и попутно сражаясь со злодеями.

Стратегия (strategy) — игровой жанр компьютерных игр, нацеленный на управление процессами разных масштабов с целью решения поставленных внутри сюжета задач для достижения определённых целей.

Квест (adventure) — игра-повествование, в которой управляемый игроком герой продвигается по сюжету и взаимодействует с игровым миром посредством применения предметов, общения с другими персонажами и решения логических задач.

Квест-головоломка (puzzle) — подтип квеста, главной задачей которого является решение загадок, задач посредством исследования виртуального мира и взаимодействия с другими персонажами.

Спортивная игра (sports) — в этом игровом жанре компьютерных игр бывают различные симуляторы, делящиеся на два основных подкласса: а) симуляторы спорта — футбол, хоккей, баскетбол и т. д.; б) спортивный менеджер — организация и руководство спортивной командой.

Гоночная игра (racing) — жанр компьютерных игр с видом от первого или от третьего лица, в которых игрок принимает участие в гоночном соревновании среди наземных, водных, воздушных или космических транспортных средств.

Другие жанры (miscellaneous) — все жанры, которые не были упомянуты выше.

genre — жанр компьютерной игры
Признак является категориальным, номинальным.
Шкала измерения признака: номинальная шкала.

*Характеристики продаж*

Сведения о продажах компьютерной игры нужны для оценки её популярности и коммерческого успеха.

Объём продаж компьютерных игр — это количество игр, проданных за определённый период времени, как правило, за год.

Объём продаж может выражаться в денежном эквиваленте или в количестве проданных копий игр. Обычно этот показатель используется как показатель успеха игровой компании или отдельной игры.

Объём продаж компьютерных игр по регионам — это количество игр, проданных в разных частях мира.

Обычно объём продаж компьютерных игр исследуется в нескольких регионах, таких как Северная Америка, Европа, Япония и остальные регионы. Эта информация нужна, чтобы лучше понимать, где игры популярны, а где нужно увеличить маркетинговые усилия.

na_sales — объём продаж в Северной Америке (млн копий)
Признак является количественным, непрерывным.
Шкала измерения признака: шкала отношений.

eu_sales — объём продаж в Европе (млн копий)
Признак является количественным, непрерывным.
Шкала измерения признака: шкала отношений.

jp_sales — объём продаж в Японии (млн копий)
Признак является количественным, непрерывным.
Шкала измерения признака: шкала отношений.

other_sales — объём продаж в остальных регионах (млн копий)
Признак является количественным, непрерывным.
Шкала измерения признака: шкала отношений.

*Характеристики оценок*

Оценки пользователей и экспертов являются мерами качества продукта, его ценности и соответствия ожиданиям потребителя. Они нужны для выбора лучшего продукта и принятия обоснованных решений.

Оценки пользователей — это оценки, которые дают пользователи продукту на основании их собственного опыта использования.


Оценки экспертов — это мнение профессионалов или экспертов, которые проанализировали продукт на основе своих знаний и опыта в области использования продукта.

Экспертные оценки имеют большой вес и помогают установить стандарты качества, а оценки пользователей позволяют получить обратную связь и улучшить продукт в соответствии с их потребностями. Кроме того, оценки пользователей и экспертов могут служить рекламным инструментом, повышая доверие к продукту среди других потребителей.

critic_score — оценка критиков
Признак является количественным, непрерывным.
Шкала измерения признака: абсолютная шкала.

user_score — оценка пользователей
Признак является количественным, непрерывным.
Шкала измерения признака: абсолютная шкала.

Entertainment Software Rating Board (ESRB) — негосударственная саморегулируемая организация в индустрии компьютерных игр. Основана в 1994 году. Основная задача — помочь потребителям, особенно родителям, сделать осознанный выбор игр, в которые играют в их семьях.

Система рейтинга включает в себя

  • рейтинговые категории,
  • характеристики содержания,
  • компоненты взаимодействия с пользователем.

Рейтинг ESRB — это система классификации компьютерных игр в Северной Америке, которая помогает потребителям определить, подходит ли данная игра для их возрастной категории.

Рейтинговые категории определяются на основе содержания и предполагают соответствие возрасту.

Everyone (E) — "Для всех" — контент, как правило, подходит для всех возрастов. Может содержать минимальное количество мультипликационного, фэнтезийного или умеренного насилия и/или нечастое использование нецензурной лексики. Категория существует с 1998 года. До этого (с 1994 по 1998 года) обозначалась как Kids to Adults (K-A).

Early Childhood (EC) — "Для детей младшего возраста" — контент подходит для детей от 3 лет и не содержит материалов, которые родители могли бы счесть неподходящими. Существовал в период с 1994 по 2018 года.

Everyone 10+ (E10+) — "Для детей от 10 лет" — контент обычно подходит для детей в возрасте от 10 лет и старше. Может содержать больше мультипликационного, фэнтезийного или умеренного насилия, мягких выражений и/или минимальных, наводящих на размышления тем. Категория существует с 2005 года.

Teen (T) — "Для подростков от 13 лет" — контент, как правило, подходит для детей от 13 лет. Может содержать насилие, непристойные темы, грубый юмор, минимальное количество крови, имитацию азартных игр и/или нечастое использование ненормативной лексики. Категория существует с 1994 года.

Mature 17+ (M) — "Для подростков от 17 лет" — контент обычно подходит для лиц старше 17 лет. Может содержать жестокое насилие, кровь и увечья, материалы сексуального характера и/или ненормативную лексику. Категория существует с 1994 года.

Adults Only 18+ (AO) — "Для взрослых" — контент подходит только для взрослых в возрасте от 17 лет и старше. Может содержать продолжительные сцены жестокого насилия, изображения сексуального характера и/или азартные игры с реальной валютой. Категория существует с 1994 года.

Rating Pending (RP) — "Рейтинг ожидается" — окончательный рейтинг ESRB ещё не присвоен. Появляется только в маркетинговых и рекламных материалах, связанных с физическим носителем компьютерной игры (например, в коробке). Ожидается, что в будущем игра будет иметь рейтинг ESRB после процедуры его присвоения. Категория существует с 1994 года.

rating — рейтинг от организации Entertainment Software Rating Board (ESRB)
Признак является категориальным, номинальным.
Шкала измерения признака: номинальная шкала.

Описание данных¶

In [16]:
def graph(data):
    '''
    Функция строит диаграмму распределения значений и диаграмму размаха
    исследуемых данных.

    Принимает набор исследуемых данных.
    '''

    fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(15, 6))
    ax1.set_title('Диаграмма распределения и диаграмма размаха' +
                  f'\nзначений признака {data.columns[0]}')
    ax1.hist(data, bins=85)
    ax1.tick_params(labelbottom=False)
    ax1.set_ylabel('Частота')
    ax2.boxplot(data, vert=False)
    ax2.tick_params(left=False, labelleft=False)
    ax2.set_xlabel('Значения признака')
    plt.show()

Признаки, измеряемые в шкале отношений, абсолютной и интервальной шкалах¶

In [17]:
data[['na_sales', 'eu_sales', 'jp_sales', 'other_sales', 'critic_score',
      'user_score', 'year_of_release']].describe(include='all').round(2)
Out[17]:
na_sales eu_sales jp_sales other_sales critic_score user_score year_of_release
count 16715.00 16715.00 16715.00 16715.00 8137.00 10014 16446.00
unique NaN NaN NaN NaN NaN 96 NaN
top NaN NaN NaN NaN NaN tbd NaN
freq NaN NaN NaN NaN NaN 2424 NaN
mean 0.26 0.15 0.08 0.05 68.97 NaN 2006.48
std 0.81 0.50 0.31 0.19 13.94 NaN 5.88
min 0.00 0.00 0.00 0.00 13.00 NaN 1980.00
25% 0.00 0.00 0.00 0.00 60.00 NaN 2003.00
50% 0.08 0.02 0.00 0.01 71.00 NaN 2007.00
75% 0.24 0.11 0.04 0.03 79.00 NaN 2010.00
max 41.36 28.96 10.22 10.57 98.00 NaN 2016.00
In [18]:
data['user_score'].sort_values().unique()
Out[18]:
array(['0', '0.2', '0.3', '0.5', '0.6', '0.7', '0.9', '1', '1.1', '1.2',
       '1.3', '1.4', '1.5', '1.6', '1.7', '1.8', '1.9', '2', '2.1', '2.2',
       '2.3', '2.4', '2.5', '2.6', '2.7', '2.8', '2.9', '3', '3.1', '3.2',
       '3.3', '3.4', '3.5', '3.6', '3.7', '3.8', '3.9', '4', '4.1', '4.2',
       '4.3', '4.4', '4.5', '4.6', '4.7', '4.8', '4.9', '5', '5.1', '5.2',
       '5.3', '5.4', '5.5', '5.6', '5.7', '5.8', '5.9', '6', '6.1', '6.2',
       '6.3', '6.4', '6.5', '6.6', '6.7', '6.8', '6.9', '7', '7.1', '7.2',
       '7.3', '7.4', '7.5', '7.6', '7.7', '7.8', '7.9', '8', '8.1', '8.2',
       '8.3', '8.4', '8.5', '8.6', '8.7', '8.8', '8.9', '9', '9.1', '9.2',
       '9.3', '9.4', '9.5', '9.6', '9.7', 'tbd', nan], dtype=object)
In [19]:
graph(pd.DataFrame(data.loc[data['user_score'].notna() &
                   (data['user_score'] != 'tbd'), 'user_score']).astype('float'))
In [20]:
for column in ['na_sales', 'eu_sales', 'jp_sales', 'other_sales',
               'critic_score', 'year_of_release']:
    graph(pd.DataFrame(data.loc[data[column].notna(), column]))

na_sales — объём продаж в Северной Америке (млн копий)
Значения определены для всех записей.
Значения определены с точностью до 0,01 млн копий.
Минимальное значение — 0, максимальное значение — 41,36 млн копий.
Среднее арифметическое значение равно 0,26 млн копий, медиана — 0,08 млн копий.
Не менее четверти всех записей содержит значение 0. Среднее арифметическое сильно отличается от медианы и близко к значению третьего квартиля (0,24 млн копий). Такое происходит потому, что в наборе данных есть значения, сильно отличающиеся от остальных значений. На диаграмме размаха они не накрываются "ящиком с усами", наблюдается длинный хвост справа на диаграмме распределения и диаграмме размаха.

eu_sales — объём продаж в Европе (млн копий)
Значения определены для всех записей.
Значения определены с точностью до 0,01 млн копий.
Минимальное значение — 0, максимальное значение — 28,96 млн копий.
Среднее арифметическое значение равно 0,15 млн копий, медиана — 0,02 млн копий.
Не менее четверти всех записей содержит значение 0. Среднее арифметическое сильно отличается от медианы и больше значения третьего квартиля (0,11 млн копий). Такое происходит потому, что в наборе данных есть значения, сильно отличающиеся от остальных значений. На диаграмме размаха они не накрываются "ящиком с усами", наблюдается длинный хвост справа на диаграмме распределения и диаграмме размаха.

jp_sales — объём продаж в Японии (млн копий)
Значения определены для всех записей.
Значения определены с точностью до 0,01 млн копий.
Минимальное значение — 0, максимальное значение — 10,22 млн копий.
Среднее арифметическое значение равно 0,08 млн копий, медиана — 0.
Не менее половины всех записей содержит значение 0. Среднее арифметическое сильно отличается от медианы и больше значения третьего квартиля (0,04 млн копий). Такое происходит потому, что в наборе данных есть значения, сильно отличающиеся от остальных значений. На диаграмме размаха они не накрываются "ящиком с усами", наблюдается длинный хвост справа на диаграмме распределения и диаграмме размаха.

other_sales — объём продаж в остальных регионах (млн копий)
Значения определены для всех записей.
Значения определены с точностью до 0,01 млн копий.
Минимальное значение — 0, максимальное значение — 28,96 млн копий.
Среднее арифметическое значение равно 0,05 млн копий, медиана — 0,01 млн копий.
Не менее четверти всех записей содержит значение 0. Среднее арифметическое сильно отличается от медианы и близко к значению третьего квартиля (0,03 млн копий). Такое происходит потому, что в наборе данных есть значения, сильно отличающиеся от остальных значений. На диаграмме размаха они не накрываются "ящиком с усами", наблюдается длинный хвост справа на диаграмме распределения и диаграмме размаха.

critic_score — оценка критиков
Значения определены для 8137 записи — это 49 % всех записей.
Значения определены с точностью до 1.
Значения признака могут быть расположены в интервале от 0 до 100, включительно.
Минимальное значение — 13, максимальное значение — 98.
Среднее арифметическое значение равно 69, медиана — 71.
Первый и третий квартили (60 и 79, соответственно) расположены близко к медианному значению. Среднее арифметическое и медиана практически равны. Распределение унимодальное, смещено вправо. Небольшой хвост наблюдается слева — эти значения также наблюдаются на диаграмме размаха.

user_score — оценка пользователей
Значения определены для 10014 записей — это 60 % всех записей.
Значения определены с точностью до 0,1.
Значения признака могут быть расположены в интервале от 0 до 10, включительно.
Минимальное значение — 0, максимальное значение — 9,7.
Среди значений встречается tbd — это мода, её частота 2424.

year_of_release — год выпуска компьютерной игры
Значения определены для 16446 записей — это 98 % всех записей.
Значения определены с точностью до 1 года.
Минимальное значение — 1980 год, максимальное значение — 2016 год.
Медиана — 2007 год.
Первый и третий квартили (2003 и 2010 года, соответственно) расположены близко к медиане. Распределение унимодальное, смещено вправо. Наблюдается "хвост" слева — эти значения не накрываются "ящиком с усами" на диаграмме размаха.

Признаки, измеряемые в номинальной шкале¶

In [21]:
data[['name', 'platform', 'genre', 'rating']].describe()
Out[21]:
name platform genre rating
count 16713 16715 16713 9949
unique 11559 31 12 8
top Need for Speed: Most Wanted PS2 Action E
freq 12 2161 3369 3990
In [22]:
data['name'].value_counts().head()
Out[22]:
Need for Speed: Most Wanted    12
Ratatouille                     9
LEGO Marvel Super Heroes        9
FIFA 14                         9
Madden NFL 07                   9
Name: name, dtype: int64
In [23]:
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(15, 6))
ax1.set_title('Диаграмма распределения и диаграмма размаха' +
              '\nколичества различных значений признака name')
ax1.hist(data['name'].value_counts(), bins=100)
ax1.tick_params(labelbottom=False)
ax1.set_ylabel('Частота')
ax2.boxplot(data['name'].value_counts(), vert=False)
ax2.tick_params(left=False, labelleft=False)
ax2.set_xlabel('Количество различных значения признака')
plt.show()

name — название компьютерной игры
Значения определены для 16 713 записей — это почти 100 % записей.
Мода — Need for Speed: Most Wanted, её частота — 12.
Всего в наборе данных встречается 11 559 уникальных значений наименований компьютерных игр.
Большинство значений встречается в наборе данных один раз, но есть и такие, которые встречаются два и более раз.
Некоторые названия игр содержат сведения о регионах продаж.

In [24]:
data['platform'].value_counts()
Out[24]:
PS2     2161
DS      2151
PS3     1331
Wii     1320
X360    1262
PSP     1209
PS      1197
PC       974
XB       824
GBA      822
GC       556
3DS      520
PSV      430
PS4      392
N64      319
XOne     247
SNES     239
SAT      173
WiiU     147
2600     133
NES       98
GB        98
DC        52
GEN       29
NG        12
SCD        6
WS         6
3DO        3
TG16       2
GG         1
PCFX       1
Name: platform, dtype: int64
In [25]:
plt.figure(figsize=(15, 3))
plt.title('Диаграмма распределения количества значений признака platform')
data['platform'].value_counts().sort_index().plot(kind='bar', rot=0)
plt.xlabel('Платформа')
plt.ylabel('Частота')
plt.show()

platform — название игровой платформы
Значения определены для всех записей.
Мода — PS2, её частота — 2161.
Минимальная частота — 1. Медианная частота — около 250.
Всего в наборе данных встречается 31 наименование платформ.
Менее 10 раз в наборе данных встречаются 6 наименований игровых платформ (редкие значения). Более 1000 раз в наборе данных встречаются 7 наименований игровых платформ (распространённые значения).

In [26]:
data['genre'].value_counts()
Out[26]:
Action          3369
Sports          2348
Misc            1750
Role-Playing    1498
Shooter         1323
Adventure       1303
Racing          1249
Platform         888
Simulation       873
Fighting         849
Strategy         683
Puzzle           580
Name: genre, dtype: int64
In [27]:
plt.figure(figsize=(15, 3))
plt.title('Диаграмма распределения количества значений признака genre')
data['genre'].value_counts().sort_index().plot(kind='bar', rot=0)
plt.xlabel('Жанр')
plt.ylabel('Частота')
plt.show()

genre — жанр компьютерной игры
Значения определены для 16713 записей — это почти 100 % записей.
Мода — Action, её частота — 3369.
Минимальная частота — 580, соответствует значению Puzzle. Медианная частота — около 1300.
Всего в наборе данных присутствует 12 наименований жанров компьютерных игр.

In [28]:
data['rating'].value_counts()
Out[28]:
E       3990
T       2961
M       1563
E10+    1420
EC         8
K-A        3
RP         3
AO         1
Name: rating, dtype: int64
In [29]:
plt.figure(figsize=(15, 3))
plt.title('Диаграмма распределения количества значений признака rating')
data['rating'].value_counts().sort_index().plot(kind='bar', rot=0)
plt.xlabel('Рейтинг')
plt.ylabel('Частота')
plt.show()

rating — рейтинг от организации ESRB
Значения признака определены для 9949 записей — это 60 % всех записей.
Мода — категория E, её частота — 3990.
Минимальная частота — 1, соответствует категории AO.
Всего в наборе данных 8 различных категорий рейтинга ESRB.
В наборе данных 4 значения встречаются менее 10 раз (редкие значения) и 4 значения встречаются более 1000 раз (распространённые значения).

Промежуточный вывод

  • В наборе данных имеются признаки, измеряемые в различных количественных и качественных шкалах.
  • В наборе данных наблюдаются аномальные значения, противоречащие физической природе данных, вложенные сведения, пропуски в данных, изменённые типы данных.
  • Необходимо провести предварительную обработку данных:
    • выявить и отредактировать/удалить сведения, содержащие аномальные значения, ошибки в данных,
    • выявить несогласующиеся значения связанных признаков,
    • извлечь вложенные сведения, и объединить записи, относящиеся к одному объекту,
    • заполнить пропуски подходящими значениями, где это возможно, в противном случае заполнить фиктивными значениями-метками,
    • привести типы данных к требуемым в соответствии с природой признака и его шкалой,
    • проверить наличие дубликатов: полных и частичных, удалить дубли,
    • обогатить данные: сгенерировать дополнительные признаки, провести категоризацию данных.

Предобработка данных¶

Обработка текстовых значений и извлечение вложенных сведений¶

Жанр компьютерной игры¶

Прежде чем провести обработку текстовых значений признака genre, необходимо обработать записи с пропущенными значениями в этом признаке.

In [30]:
data[data['genre'].isna()]
Out[30]:
name platform year_of_release genre na_sales eu_sales jp_sales other_sales critic_score user_score rating
659 NaN GEN 1993.0 NaN 1.78 0.53 0.00 0.08 NaN NaN NaN
14244 NaN GEN 1993.0 NaN 0.00 0.00 0.03 0.00 NaN NaN NaN

В двух записях отсутствуют сведения о жанре. В них также отсутствуют сведения о названии компьютерной игры. Вероятно, во время сбора данных или копирования произошла техническая ошибка, приведшая к потере данных в этих признаках.

Восстановить сведения в этих записях не представляется возможным. Поэтому их необходимо удалить.

In [31]:
data.dropna(subset=['genre'], inplace=True)
data['genre'].isna().sum()
Out[31]:
0

Приведём наименования жанров к нижнему регистру.

In [32]:
data['genre'] = data['genre'].str.lower()
data['genre'].sort_values().unique()
Out[32]:
array(['action', 'adventure', 'fighting', 'misc', 'platform', 'puzzle',
       'racing', 'role-playing', 'shooter', 'simulation', 'sports',
       'strategy'], dtype=object)

Рейтинг пользователей¶

Среди значений признака user_score есть одно нечисловое значение — 'tbd'.

In [33]:
data['user_score'].sort_values().unique()
Out[33]:
array(['0', '0.2', '0.3', '0.5', '0.6', '0.7', '0.9', '1', '1.1', '1.2',
       '1.3', '1.4', '1.5', '1.6', '1.7', '1.8', '1.9', '2', '2.1', '2.2',
       '2.3', '2.4', '2.5', '2.6', '2.7', '2.8', '2.9', '3', '3.1', '3.2',
       '3.3', '3.4', '3.5', '3.6', '3.7', '3.8', '3.9', '4', '4.1', '4.2',
       '4.3', '4.4', '4.5', '4.6', '4.7', '4.8', '4.9', '5', '5.1', '5.2',
       '5.3', '5.4', '5.5', '5.6', '5.7', '5.8', '5.9', '6', '6.1', '6.2',
       '6.3', '6.4', '6.5', '6.6', '6.7', '6.8', '6.9', '7', '7.1', '7.2',
       '7.3', '7.4', '7.5', '7.6', '7.7', '7.8', '7.9', '8', '8.1', '8.2',
       '8.3', '8.4', '8.5', '8.6', '8.7', '8.8', '8.9', '9', '9.1', '9.2',
       '9.3', '9.4', '9.5', '9.6', '9.7', 'tbd', nan], dtype=object)

Aббревиатура 'tbd' в столбце с оценкой пользователей означает "будет определено" (to be determined). Скорее всего, это означает, что рейтинг ещё не был установлен или расчёт ещё не завершён. Это может быть связано с тем, что игра только что вышла или прошла недостаточное количество обзоров, чтобы для неё был установлен окончательный рейтинг.

Поскольку признак user_score принимает числовые значения, и значение 0 означает не отсутствие рейтинга, а его низкий уровень, заменим 'tbd' на значение-метку (−1). Таким образом, значение-метка является числовым, но не входит во множество допустимых значений признака и поэтому означает отсутствие значения рейтинга пользователей.

In [34]:
data['user_score'] = data['user_score'].replace('tbd', '-1')
data['user_score'].sort_values().unique()
Out[34]:
array(['-1', '0', '0.2', '0.3', '0.5', '0.6', '0.7', '0.9', '1', '1.1',
       '1.2', '1.3', '1.4', '1.5', '1.6', '1.7', '1.8', '1.9', '2', '2.1',
       '2.2', '2.3', '2.4', '2.5', '2.6', '2.7', '2.8', '2.9', '3', '3.1',
       '3.2', '3.3', '3.4', '3.5', '3.6', '3.7', '3.8', '3.9', '4', '4.1',
       '4.2', '4.3', '4.4', '4.5', '4.6', '4.7', '4.8', '4.9', '5', '5.1',
       '5.2', '5.3', '5.4', '5.5', '5.6', '5.7', '5.8', '5.9', '6', '6.1',
       '6.2', '6.3', '6.4', '6.5', '6.6', '6.7', '6.8', '6.9', '7', '7.1',
       '7.2', '7.3', '7.4', '7.5', '7.6', '7.7', '7.8', '7.9', '8', '8.1',
       '8.2', '8.3', '8.4', '8.5', '8.6', '8.7', '8.8', '8.9', '9', '9.1',
       '9.2', '9.3', '9.4', '9.5', '9.6', '9.7', nan], dtype=object)

Название компьютерной игры¶

Приведём наименования игр к нижнему регистру.

In [35]:
data['name'] = data['name'].str.lower()
data['name'].sample(7)
Out[35]:
9407                    wwe survivor series
4781           warriors orochi 2 (jp sales)
14816                    dream girl premier
10366      naruto shippuden 3d: the new era
158                       super smash bros.
13661                                scaler
4565     command & conquer 3: tiberium wars
Name: name, dtype: object

Название платформы¶

Приведём наименования платформ к нижнему регистру.

In [36]:
data['platform'] = data['platform'].str.lower()
data['platform'].sort_values().unique()
Out[36]:
array(['2600', '3do', '3ds', 'dc', 'ds', 'gb', 'gba', 'gc', 'gen', 'gg',
       'n64', 'nes', 'ng', 'pc', 'pcfx', 'ps', 'ps2', 'ps3', 'ps4', 'psp',
       'psv', 'sat', 'scd', 'snes', 'tg16', 'wii', 'wiiu', 'ws', 'x360',
       'xb', 'xone'], dtype=object)

Категории рейтинга ESRB¶

Приведём наименования категорий рейтинга ESRB к нижнему регистру.

In [37]:
data['rating'] = data['rating'].str.lower()
data['rating'].sort_values().unique()
Out[37]:
array(['ao', 'e', 'e10+', 'ec', 'k-a', 'm', 'rp', 't', nan], dtype=object)

Обработка аномальных и несогласованных значений¶

Информация о сроках продаж в названии игры¶

Среди компьютерных игр есть такие, которые в своём названии содержат значение 'weekly sales'. Это уточнение сделано для тех игр, у которых отслеживался объём продаж, вероятно, за первую неделю после выхода игры на рынок.

In [38]:
data.loc[data['name'].str.contains('weekly'), 'name'].sort_values().head()
Out[38]:
7837     chou-kuukan night pro yakyuu king (weekly jp s...
13665                   fifa soccer 2003 (weekly jp sales)
8040     international superstar soccer 2000 (jp weekly...
10640    international superstar soccer 64 (weekly jp s...
13146    medal of honor: european assault (weekly jp sa...
Name: name, dtype: object

Для этих же игр существует информация об общем объёме продаж по регионам за всё время, в котором учтён объём продаж за первую неделю.

In [39]:
data[data['name'].str.contains("fifa soccer 2003")].sort_values(by='name')
Out[39]:
name platform year_of_release genre na_sales eu_sales jp_sales other_sales critic_score user_score rating
393 fifa soccer 2003 ps2 2002.0 sports 0.46 2.28 0.05 0.61 88.0 6.7 e
3183 fifa soccer 2003 xb 2002.0 sports 0.20 0.40 0.00 0.04 88.0 7.7 e
11457 fifa soccer 2003 gc 2002.0 sports 0.06 0.02 0.00 0.00 86.0 7.8 e
12917 fifa soccer 2003 gba 2002.0 sports 0.04 0.01 0.00 0.00 76.0 -1 e
13665 fifa soccer 2003 (weekly jp sales) ps2 2002.0 sports 0.00 0.00 0.04 0.00 NaN NaN NaN

Совершенно очевидно, что записи со значениями 'weekly sales' необходимо удалить.

In [40]:
data.drop(index=data.loc[data['name'].str.contains("weekly"), 'name'].index,
          inplace=True)
data.loc[data['name'].str.contains("weekly"), 'name'].count()
Out[40]:
0

Информация о регионах продаж в названии игры¶

Среди компьютерных игр есть ещё и такие, которые в своём названии содержат значение 'sales'. Это произошло от того, что информация о компьютерных играх внесена в набор данных вместе с информацией о продажах по регионам в форме отдельных записей.

In [41]:
data.loc[data['name'].str.contains('sales'), 'name'].sort_values().head()
Out[41]:
8597       .hack//g.u. vol.2//reminisce (jp sales)
9249                 ape escape academy (jp sales)
13825    atelier iris 3: grand phantasm (jp sales)
5979     atelier iris 3: grand phantasm (us sales)
15015       battlefield 2: modern combat(jp sales)
Name: name, dtype: object

Необходимо удалить из названий компьютерных игр сведения о регионах продаж.

In [42]:
list_for_replace = [
    '\(higher jp sales\)', '\(jp sales, but wrong system\)',
    '\(old all region sales\)', '\(jp & incomplete us sales\)',
    '\(american and others sales\)', '\(all regions sales\)',
    '\(sales, but wrong system\)', '\(correct us sales\)',
    '\(old us sales\)', '\(old jp sales\)', '\(jp & others sales\)',
    '\(us & others sales\)', '\(japan sales\)', '\(all region sales\)',
    '\(american sales\)',  '\(jp sales\)', '\(us sales\)', '\(others sales\)'
]

for value in list_for_replace:
    data.loc[data['name'].str.contains(value), 'name'] = \
    data.loc[data['name'].str.contains(value), 'name'].str.replace(value, '').str.strip()

data.loc[data['name'].str.contains('sales'), 'name'].count()
Out[42]:
0

Исправим ошибочные значения названий игр.

In [43]:
data.loc[data['name'] == 'brave story: new traveler', 'name'] = \
'brave story: new traveller'

data.loc[data['name'] == 'imagine figure skater', 'name'] = \
'imagine: figure skater'

data.loc[data['name'] == 'namco museum 50th anniversary', 'name'] = \
'namco museum: 50th anniversary'

data.loc[data['name'] == 'rengoku ii:  the stairway to h.e.a.v.e.n.', 'name'] = \
'rengoku ii: the stairway to h.e.a.v.e.n.'

data.loc[data['name'] == 'dancedancerevolution ii', 'name'] = \
'dance dance revolution ii'

Исправим ошибочные значения названий жанров.

In [44]:
data.loc[(data['name'] == 'dance dance revolution: mario mix') &
         (data['genre'] == 'simulation'), 'genre'] = 'misc'

data.loc[(data['name'] == 'dragon ball z: budokai tenkaichi 2') &
         (data['genre'] == 'action'), 'genre'] = 'fighting'

data.loc[(data['name'] == 'dragon ball: origins') &
         (data['genre'] == 'adventure'), 'genre'] = 'action'

data.loc[(data['name'] == 'earth defense force 2017') &
         (data['genre'] == 'shooter'), 'genre'] = 'action'

data.loc[(data['name'] == 'fishing master') &
         (data['genre'] == 'misc'), 'genre'] = 'sports'

data.loc[(data['name'] == 'prinny: can i really be the hero?') &
         (data['genre'] == 'action'), 'genre'] = 'platform'

data.loc[(data['name'] == 'the godfather: blackhand edition') &
         (data['genre'] == 'adventure'), 'genre'] = 'action'

data.loc[(data['name'] == 'tomb raider: underworld') &
         (data['genre'] == 'adventure'), 'genre'] = 'action'

data.loc[(data['name'] == 'yu-gi-oh! the eternal duelist soul') &
         (data['genre'] == 'misc'), 'genre'] = 'strategy'

data.loc[data['name'].str.contains('scrabble'), 'genre'] = 'puzzle'

data[(data['name'] == 'dance dance revolution: mario mix') |
     (data['name'] == 'dragon ball z: budokai tenkaichi 2') |
     (data['name'] == 'dragon ball: origins') |
     (data['name'] == 'earth defense force 2017') |
     (data['name'] == 'fishing master') |
     (data['name'] == 'prinny: can i really be the hero?') |
     (data['name'] == 'the godfather: blackhand edition') |
     (data['name'] == 'tomb raider: underworld') |
     (data['name'] == 'yu-gi-oh! the eternal duelist soul') |
     data['name'].str.contains('scrabble')].sort_values(by='name')
Out[44]:
name platform year_of_release genre na_sales eu_sales jp_sales other_sales critic_score user_score rating
12799 dance dance revolution: mario mix gc 2005.0 misc 0.00 0.00 0.05 0.00 NaN NaN NaN
4203 dance dance revolution: mario mix gc 2005.0 misc 0.36 0.09 0.00 0.01 69.0 8.4 e
2579 dragon ball z: budokai tenkaichi 2 ps2 2006.0 fighting 0.66 0.02 0.00 0.11 73.0 8.6 t
6100 dragon ball z: budokai tenkaichi 2 wii 2006.0 fighting 0.24 0.03 0.00 0.02 72.0 8.5 t
5294 dragon ball z: budokai tenkaichi 2 wii NaN fighting 0.15 0.05 0.14 0.01 NaN NaN NaN
9953 dragon ball: origins ds 2008.0 action 0.08 0.02 0.00 0.01 78.0 7.5 t
7213 dragon ball: origins ds 2008.0 action 0.04 0.00 0.17 0.00 NaN NaN NaN
15969 earth defense force 2017 x360 2006.0 action 0.00 0.00 0.02 0.00 NaN NaN NaN
11571 earth defense force 2017 x360 2006.0 action 0.04 0.00 0.03 0.00 69.0 7.7 t
12353 fishing master wii 2007.0 sports 0.00 0.00 0.06 0.00 NaN NaN NaN
5707 fishing master wii 2007.0 sports 0.29 0.00 0.00 0.02 58.0 8.1 e
10984 prinny: can i really be the hero? psp 2008.0 platform 0.03 0.00 0.05 0.01 72.0 7 t
12568 prinny: can i really be the hero? psp NaN platform 0.06 0.00 0.00 0.00 NaN NaN NaN
11088 scrabble psp 2009.0 puzzle 0.08 0.00 0.00 0.01 NaN -1 e
6619 scrabble ps 1999.0 puzzle 0.14 0.10 0.00 0.02 NaN NaN NaN
6643 scrabble ds 2009.0 puzzle 0.20 0.02 0.00 0.03 NaN -1 e
6968 scrabble ds 2009.0 puzzle 0.00 0.23 0.00 0.00 NaN NaN NaN
4116 scrabble 2007 edition ds 2007.0 puzzle 0.00 0.47 0.00 0.00 NaN NaN NaN
12785 scrabble blast! gba 2005.0 puzzle 0.04 0.01 0.00 0.00 NaN NaN NaN
6752 sorry! / aggravation / scrabble junior gba 2005.0 puzzle 0.18 0.07 0.00 0.00 NaN NaN NaN
8743 the godfather: blackhand edition wii 2007.0 action 0.14 0.00 0.00 0.01 77.0 8.5 m
8155 tomb raider: underworld ps2 2009.0 action 0.09 0.04 0.00 0.05 NaN 5.8 t
7862 tomb raider: underworld ds 2008.0 action 0.15 0.02 0.00 0.01 70.0 8.4 t
6567 tomb raider: underworld ps2 2009.0 action 0.00 0.21 0.00 0.04 NaN NaN NaN
11589 tomb raider: underworld pc 2008.0 action 0.00 0.06 0.00 0.01 80.0 7.7 t
4299 tomb raider: underworld wii 2008.0 action 0.13 0.27 0.00 0.05 70.0 7.2 t
1924 tomb raider: underworld x360 2008.0 action 0.53 0.42 0.01 0.11 76.0 6.6 t
1579 tomb raider: underworld ps3 2008.0 action 0.45 0.55 0.05 0.22 75.0 7.2 t
4731 yu-gi-oh! the eternal duelist soul gba 2001.0 strategy 0.00 0.00 0.40 0.01 NaN NaN NaN
815 yu-gi-oh! the eternal duelist soul gba 2001.0 strategy 1.64 0.36 0.00 0.07 NaN NaN NaN

Согласование значений года выпуска и названия платформы¶

Среди записей набора данных есть одна, в которой платформа не соответствует году выпуска.

In [45]:
data[(data['platform'] == 'ds') & (data['year_of_release'] == 1985)]
Out[45]:
name platform year_of_release genre na_sales eu_sales jp_sales other_sales critic_score user_score rating
15957 strongest tokyo university shogi ds ds 1985.0 action 0.0 0.0 0.02 0.0 NaN NaN NaN

Поскольку установить название платформы для этой игры не представляется возможным, удалим запись.

In [46]:
data.drop(index=data[(data['platform'] == 'ds') &
                     (data['year_of_release'] == 1985)].index, inplace=True)
data[(data['platform'] == 'ds') & (data['year_of_release'] == 1985)].shape[0]
Out[46]:
0

Кроме того, среди записей есть одна, в которой год выпуска платформы не соответствует платформе.

In [47]:
data[(data['platform'] == 'xb') & (data['year_of_release'] < 2001)]
Out[47]:
name platform year_of_release genre na_sales eu_sales jp_sales other_sales critic_score user_score rating
2076 nfl fever 2002 xb 2000.0 sports 0.74 0.21 0.0 0.04 79.0 8.5 e

Поскольку платформа Xbox One появилась только в 2001 году, необходимо исправить ошибочное значение.

In [48]:
data.loc[(data['platform'] == 'xb') &
         (data['year_of_release'] < 2001), 'year_of_release'] = 2001
len(data[(data['platform'] == 'xb') & (data['year_of_release'] < 2001)])
Out[48]:
0

Категории рейтинга ESRB¶

Поскольку категория K-A была заменена на категорию E, произведём и мы соответствующую замену.

In [49]:
data['rating'].replace('k-a', 'e', inplace=True)
data['rating'].sort_values().unique()
Out[49]:
array(['ao', 'e', 'e10+', 'ec', 'm', 'rp', 't', nan], dtype=object)

Обработка пропусков¶

Предварительно зададим функцию, выводящую таблицу с распределением пропущенных значений.

In [50]:
def show_na():
    '''
    Функция подсчёта пропущенных значений.
    
    Возвращает таблицу распределения пропущенных значений,
    отсортированную по убыванию значений.
    
    '''

    total = data.isna().sum().sort_values(ascending=False)
    percent = (data.isna().sum() /
               data.isna().count() * 100).round(1).sort_values(ascending=False)
    display(pd.concat([total, percent], axis=1, keys=['Всего пропусков', '%']))
In [51]:
show_na()
Всего пропусков %
critic_score 8555 51.3
rating 6743 40.4
user_score 6678 40.0
year_of_release 268 1.6
name 0 0.0
platform 0 0.0
genre 0 0.0
na_sales 0 0.0
eu_sales 0 0.0
jp_sales 0 0.0
other_sales 0 0.0

Год выпуска¶

Среди значений признака year_of_release 268 пропуска. Вероятно, эти данные были потеряны в результате технической ошибки при извлечении или копировании данных.

Составим словарь с годами выпуска для тех игр, для которых есть пропуски в значениях признака year_of_release. Данные возьмём из открытых источников.

In [52]:
years_of_release = {
    "prinny: can i really be the hero?": 2008,
    "dragon ball z: budokai tenkaichi 2": 2006,
    "yu-gi-oh! 5d's wheelie breakers": 2009,
    'luminous arc 2': 2008,
    "cabela's alaskan adventure": 2006,
    'samurai spirits: tenkaichi kenkakuden': 2006,
    'sega rally 2006': 2006,
    'mountain bike adrenaline': 2007,
    "mcfarlane's evil prophecy": 2004,
    'demon chaos': 2005,
    'star trek: conquest': 2007,
    'saru! get you! million monkeys': 2006,
    'ejay clubworld': 2002,
    'sword of the samurai': 2003,
    "james cameron's dark angel": 2002,
    'nba starting five': 2002,
    'yu yu hakusho: dark tournament': 2004,
    'tribes: aerial assault': 2002,
    'jet x20': 2002,
    'mega man x collection': 2006,
    'college hoops 2k6': 2005,
    'haven: call of the king': 2002,
    'final fantasy xi': 2002,
    'harvest moon: save the homeland': 2001,
    'nfl gameday 2003': 2002,
    'nascar: dirt to daytona': 2002,
    'monster hunter 2': 2006,
    'mlb slugfest 20-03': 2002,
    'wheel of fortune': 2003,
    'suikoden iii': 2002,
    'nascar thunder 2003': 2002,
    'wwe smackdown vs. raw 2006': 2005,
    'fifa soccer 2004': 2003,
    'madden nfl 2004': 2003,
    'ferrari: the race experience': 2010,
    "dance! it's your stage": 2010,
    'saint': 2009,
    'wii de asobu: metroid prime': 2009,
    'combat wings: the great battles of wwii': 2012,
    'swords': 2010,
    "luxor: pharaoh's challenge": 2008,
    'reader rabbit 2nd grade': 2011,
    "flip's twisted world": 2010,
    'build-a-bear workshop: friendship valley': 2010,
    'zero: tsukihami no kamen': 2008,
    "disney's chicken little: ace in action": 2006,
    'our house party!': 2009,
    'vegas party': 2009,
    'trauma team': 2010,
    'dance dance revolution ii': 2011,
    'big beach sports 2': 2010,
    "tony hawk's downhill jam": 2006,
    'nhl slapshot': 2010,
    'tiger woods pga tour 07': 2006,
    'madden nfl 11': 2010,
    'rhythm heaven': 2011,
    'call of duty 3': 2006,
    'lego indiana jones: the original adventures': 2008,
    'brothers in arms: furious 4': 2015,
    'akb1/48: idol to guam de koishitara...': 2011,
    'football manager 2007': 2006,
    'world of tanks': 2014,
    'majesty 2: the fantasy kingdom sim': 2009,
    'tour de france 2011': 2011,
    'mobile ops: the one year war': 2008,
    'national geographic challenge!': 2011,
    'yoostar on mtv': 2011,
    'get fit with mel b': 2010,
    'jurassic park: the game': 2011,
    'otomedius excellent': 2011,
    'star trek: legacy': 2006,
    'gun': 2005,
    'tropico 4': 2011,
    'wet': 2009,
    'madden nfl 06': 2005,
    'shaun white snowboarding': 2008,
    'shorts': 2009,
    'dream dancer': 2009,
    'jet impulse': 2007,
    'pdc world championship darts 2008': 2008,
    "shonen jump's yu-gi-oh! gx card almanac": 2007,
    'writing and speaking beautiful japanese ds': 2007,
    'runaway: a twist of fate': 2009,
    'steal princess': 2008,
    'legacy of ys: books i & ii': 2009,
    'bikkuriman daijiten': 2007,
    'housekeeping': 2010,
    'captain america: super soldier': 2011,
    'jewel link chronicles: mountains of madness': 2012,
    'chou soujuu mecha mg': 2006,
    'alex rider: stormbreaker': 2006,
    'tornado': 2008,
    'mega man battle network: operation shooting star': 2009,
    'charm girls club: my fashion show': 2009,
    'egg monster hero': 2005,
    'my healthy cooking coach': 2009,
    'atsumare! power pro kun no ds koushien': 2006,
    'the daring game for girls': 2009,
    'charm girls club: my fashion mall': 2009,
    'shrek the third': 2007,
    'advance wars: days of ruin': 2008,
    'hakuouki: shinsengumi kitan': 2008,
    'agarest senki: re-appearance': 2008,
    'umineko no naku koro ni san: shinjitsu to gensou no yasoukyoku': 2011,
    'the history channel: great battles - medieval': 2010,
    'monster hunter frontier online': 2007,
    'port royale 3': 2012,
    'happy feet two': 2011,
    'record of agarest war zero': 2009,
    'bejeweled 3': 2010,
    'splatterhouse': 2010,
    'backbreaker': 2010,
    'wrc: fia world rally championship': 2010,
    'move fitness': 2011,
    'singularity': 2010,
    'jonah lomu rugby challenge': 2011,
    'rock revolution': 2008,
    'silent hill: homecoming': 2008,
    "robert ludlum's the bourne conspiracy": 2008,
    'sonic the hedgehog': 2006,
    'test drive unlimited 2': 2011,
    'the lord of the rings: war in the north': 2011,
    'yakuza 4': 2010,
    'rock band': 2007,
    'aquaman: battle for atlantis': 2003,
    'without warning': 2005,
    'the king of fighters: maximum impact - maniax': 2005,
    'tom and jerry in war of the whiskers': 2002,
    'combat elite: wwii paratroopers': 2005,
    "tom clancy's rainbow six: critical hour": 2006,
    'rayman arena': 2001,
    'drake of the 99 dragons': 2003,
    'godzilla: destroy all monsters melee': 2002,
    'transworld surf': 2001,
    'all-star baseball 2005': 2004,
    'robotech: battlecry': 2002,
    'unreal championship 2: the liandri conflict': 2005,
    'star wars jedi knight ii: jedi outcast': 2002,
    'the chronicles of riddick: escape from butcher bay': 2004,
    'def jam: fight for ny': 2004,
    'madden nfl 2002': 2001,
    'metal gear solid 2: substance': 2002,
    'namco museum': 2001,
    'hitman 2: silent assassin': 2002,
    'home run': 1978,
    'breakaway iv': 1978,
    'ghostbusters ii': 1989,
    'flag capture': 1978,
    'indy 500': 1977,
    'slot machine': 1979,
    'dragster': 1980,
    'hangman': 1978,
    'super breakout': 1978,
    "maze craze: a game of cops 'n robbers": 1980,
    'circus atari': 1977,
    'karate': 1982,
    'fishing derby': 1980,
    'air-sea battle': 1977,
    'combat': 1977,
    'adventure': 1979,
    'space invaders': 1980,
    'inversion': 2012,
    'homeworld remastered collection': 2015,
    'wrc: fia world rally championship': 2010,
    'battle vs. chess': 2011,
    'grid': 2008,
    'clockwork empires': 2016,
    'rollercoaster tycoon': 1999,
    'dead island: riptide': 2013,
    'rocksmith': 2011,
    'street fighter iv': 2008,
    'test drive unlimited 2': 2011,
    'dead space 3': 2013,
    'bioshock 2': 2010,
    'tomb raider (2013)': 2013,
    'tera': 2011,
    'call of duty: black ops': 2010,
    'pdc world championship darts 2008': 2008,
    'payout poker & casino': 2006,
    'fullmetal alchemist: brotherhood': 2010,
    'major league baseball 2k8': 2008,
    'half-minute hero 2': 2011,
    'samurai shodown anthology': 2008,
    'major league baseball 2k6': 2006,
    'super robot wars og saga: masou kishin ii - revelation of evil god': 2012,
    'valkyria chronicles iii: unrecorded chronicles': 2011,
    'danganronpa: trigger happy havoc': 2010,
    'the golden compass': 2007,
    'pes 2009: pro evolution soccer': 2008,
    'madden nfl 07': 2006,
    'lego batman: the videogame': 2008,
    'disgaea 3: absence of detention': 2011,
    'donkey kong land iii': 1997,
    'custom robo': 1999,
    'famista 64': 1997,
    'wcw backstage assault': 2000,
    'triple play 99': 1998,
    'legacy of kain: soul reaver': 1999,
    'the dukes of hazzard ii: daisy dukes it out': 2000,
    'twisted metal: small brawl': 2001,
    'alone in the dark: the new nightmare': 2001,
    'action man-operation extreme': 2000,
    'b.l.u.e.: legend of water': 1998,
    'lego harry potter: years 5-7': 2011,
    'harvest moon: the tale of two towns': 2011,
    'pet zombies': 2011,
    'face racers: photo finish': 2011,
    'the hidden': 2011,
    'dream trigger 3d': 2011,
    'beyond the labyrinth': 2012,
    'mario tennis': 2012,
    "frogger's adventures: temple of the frog": 2001,
    'warioware: twisted!': 2004,
    'the chronicles of narnia: the lion, the witch and the wardrobe': 2005,
    "cubix robots for everyone: clash 'n' bash": 2002,
    'teen titans': 2005,
    "disney's cinderella: magical dreams": 2005,
    'super puzzle fighter ii': 2003,
    'drill dozer': 2005,
    'sabre wulf': 2004,
    'super duper sumos': 2003,
    'nba street vol. 2': 2003,
    'nba live 2003': 2002,
    'nicktoons: battle for volcano island': 2006,
    'pac-man fever': 2002,
    'nintendo puzzle collection': 2003,
    'street hoops': 2002,
    'giftpia': 2003,
    'smashing drive': 2002,
    'nhl hitz pro': 2003,
    'tube slider': 2003,
    'dinotopia: the sunstone odyssey': 2003,
    'freaky flyers': 2003,
    'virtua quest': 2004
}

Заполним пропущенные значения признака year_of_release значениями из словаря.

In [53]:
for value in years_of_release:
    data.loc[data['name'] == value, 'year_of_release'] = \
    data.loc[data['name'] == value, 'year_of_release'].fillna(years_of_release.get(value))
In [54]:
data['year_of_release'].sort_values().unique()
Out[54]:
array([1977., 1978., 1979., 1980., 1981., 1982., 1983., 1984., 1985.,
       1986., 1987., 1988., 1989., 1990., 1991., 1992., 1993., 1994.,
       1995., 1996., 1997., 1998., 1999., 2000., 2001., 2002., 2003.,
       2004., 2005., 2006., 2007., 2008., 2009., 2010., 2011., 2012.,
       2013., 2014., 2015., 2016.])
In [55]:
show_na()
Всего пропусков %
critic_score 8555 51.3
rating 6743 40.4
user_score 6678 40.0
name 0 0.0
platform 0 0.0
year_of_release 0 0.0
genre 0 0.0
na_sales 0 0.0
eu_sales 0 0.0
jp_sales 0 0.0
other_sales 0 0.0

Изменение типов данных¶

Поскольку признак user_score принимает числовые значения, то тип данных необходимо изменить с object на float64.

In [56]:
data['user_score'] = pd.to_numeric(data['user_score'])
data['user_score'].dtypes
Out[56]:
dtype('float64')

Поскольку признак year_of_release принимает целочисленные значения, то тип данных необходимо изменить с float64 на int64.

In [57]:
data['year_of_release'] = data['year_of_release'].astype('int64')
data['year_of_release'].dtypes
Out[57]:
dtype('int64')

Обработка дубликатов¶

Полные дубликаты в наборе данных отсутствуют.

In [58]:
data.duplicated().sum()
Out[58]:
0

Поскольку в названиях компьютерных игр были удалены сведения о регионах продаж, это могло привести к появлению частичных дубликатов.

Основными сведениями для проверки на наличие частичных дубликатов являются значения признаков name, platform и year_of_release, позволяющие однозначно идентифицировать компьютерную игру.

In [59]:
loc_data = data[
    data[['name', 'platform', 'year_of_release']].duplicated(keep=False)
    ].sort_values(by='name')
loc_data.head(10)
Out[59]:
name platform year_of_release genre na_sales eu_sales jp_sales other_sales critic_score user_score rating
7087 .hack//g.u. vol.2//reminisce ps2 2006 role-playing 0.11 0.09 0.00 0.03 NaN NaN NaN
8597 .hack//g.u. vol.2//reminisce ps2 2006 role-playing 0.00 0.00 0.16 0.00 NaN NaN NaN
5455 ape escape academy psp 2004 misc 0.13 0.15 0.00 0.05 51.0 5.8 e10+
9249 ape escape academy psp 2004 misc 0.00 0.00 0.13 0.00 NaN NaN NaN
5979 atelier iris 3: grand phantasm ps2 2006 role-playing 0.14 0.11 0.00 0.04 NaN NaN NaN
13825 atelier iris 3: grand phantasm ps2 2006 role-playing 0.00 0.00 0.04 0.00 NaN NaN NaN
4400 battlefield 2: modern combat ps2 2005 shooter 0.37 0.01 0.00 0.06 80.0 8.5 t
15015 battlefield 2: modern combat ps2 2005 shooter 0.00 0.00 0.02 0.00 NaN NaN NaN
8805 bleach: dark souls ds 2007 fighting 0.12 0.02 0.00 0.01 82.0 7.9 t
10670 bleach: dark souls ds 2007 fighting 0.00 0.00 0.10 0.00 NaN NaN NaN

Таким образом, всего кандидатов в дубли — 198.

Создадим вспомогательный набор данных, в котором просуммируем объёмы продаж каждой игры для каждой платформы, выпущенной за каждый год.

In [60]:
columns = ['name', 'platform', 'year_of_release', 'genre']

data2 = data[
    data[columns].duplicated(keep=False)
    ].groupby(columns)[['na_sales', 'eu_sales', 'jp_sales', 'other_sales']].agg('sum').reset_index()
data2.head()
Out[60]:
name platform year_of_release genre na_sales eu_sales jp_sales other_sales
0 .hack//g.u. vol.2//reminisce ps2 2006 role-playing 0.11 0.09 0.16 0.03
1 ape escape academy psp 2004 misc 0.13 0.15 0.13 0.05
2 atelier iris 3: grand phantasm ps2 2006 role-playing 0.14 0.11 0.04 0.04
3 battlefield 2: modern combat ps2 2005 shooter 0.37 0.01 0.02 0.06
4 bleach: dark souls ds 2007 fighting 0.12 0.02 0.10 0.01

Передадим известные значения рейтинга для записей во вспомогательном наборе данных.

In [61]:
for column in ['critic_score', 'user_score', 'rating']:
    for game_name in (loc_data.loc[loc_data[column].notna(), 'name'].unique()):
        for platform_name in (loc_data.loc[loc_data[column].notna() &
                                           (loc_data['name'] == game_name),
                                           'platform']).unique():

            set_score = pd.Series(loc_data.loc[loc_data[column].notna() &
                                               (loc_data['name'] == game_name) &
                                               (loc_data['platform'] == platform_name),
                                               column]).reset_index(drop=True)

            data2.loc[(data2['name'] == game_name) &
                      (data2['platform'] == platform_name),
                      column] = set_score[0]

data2.head()
Out[61]:
name platform year_of_release genre na_sales eu_sales jp_sales other_sales critic_score user_score rating
0 .hack//g.u. vol.2//reminisce ps2 2006 role-playing 0.11 0.09 0.16 0.03 NaN NaN NaN
1 ape escape academy psp 2004 misc 0.13 0.15 0.13 0.05 51.0 5.8 e10+
2 atelier iris 3: grand phantasm ps2 2006 role-playing 0.14 0.11 0.04 0.04 NaN NaN NaN
3 battlefield 2: modern combat ps2 2005 shooter 0.37 0.01 0.02 0.06 80.0 8.5 t
4 bleach: dark souls ds 2007 fighting 0.12 0.02 0.10 0.01 82.0 7.9 t
In [62]:
data2['critic_score'].sort_values().unique()
Out[62]:
array([43., 46., 48., 50., 51., 52., 57., 58., 60., 61., 62., 64., 65.,
       66., 67., 68., 69., 70., 71., 72., 73., 75., 77., 78., 79., 80.,
       82., 83., 86., 87., nan])
In [63]:
data2['user_score'].sort_values().unique()
Out[63]:
array([-1. ,  4.1,  4.4,  4.6,  5.4,  5.5,  5.7,  5.8,  5.9,  6.2,  6.5,
        6.6,  6.8,  6.9,  7. ,  7.2,  7.3,  7.4,  7.5,  7.6,  7.7,  7.8,
        7.9,  8. ,  8.1,  8.2,  8.3,  8.4,  8.5,  8.7,  8.9,  9. ,  nan])
In [64]:
data2['rating'].sort_values().unique()
Out[64]:
array(['e', 'e10+', 'm', 't', nan], dtype=object)

Удалим из основного набора данных дублирующиеся записи.

In [65]:
data.shape[0]
Out[65]:
16692
In [66]:
data.drop(
    index=data[data[['name', 'platform', 'year_of_release']].duplicated(keep=False)].index,
    inplace=True
)
len(data[data[['name', 'platform', 'year_of_release']].duplicated(keep=False)])
Out[66]:
0
In [67]:
data.shape[0]
Out[67]:
16494

Добавим к основному набору данных записи из вспомогательного набора данных.

In [68]:
data = pd.concat([data, data2])
data.shape[0]
Out[68]:
16593

Обработка пропусков (продолжение)¶

In [69]:
show_na()
Всего пропусков %
critic_score 8458 51.0
rating 6646 40.1
user_score 6581 39.7
name 0 0.0
platform 0 0.0
year_of_release 0 0.0
genre 0 0.0
na_sales 0 0.0
eu_sales 0 0.0
jp_sales 0 0.0
other_sales 0 0.0

Рейтинги критиков и пользователей¶

Пропуски в значениях признаков critic_score и user_score заполним значением-меткой (−1).

Пропуски в этих признаках возникли из-за того, что в открытом источнике данных отсутствовали оценки для некоторых игр. Вероятно, оценки были собраны в определённых регионах распространения игр, в то время как некоторые игры распространялись только в других регионах мира.

In [70]:
data['critic_score'].fillna(-1, inplace=True)
data['user_score'].fillna(-1, inplace=True)
In [71]:
data['critic_score'].sort_values().unique()
Out[71]:
array([-1., 13., 17., 19., 20., 21., 22., 23., 24., 25., 26., 27., 28.,
       29., 30., 31., 32., 33., 34., 35., 36., 37., 38., 39., 40., 41.,
       42., 43., 44., 45., 46., 47., 48., 49., 50., 51., 52., 53., 54.,
       55., 56., 57., 58., 59., 60., 61., 62., 63., 64., 65., 66., 67.,
       68., 69., 70., 71., 72., 73., 74., 75., 76., 77., 78., 79., 80.,
       81., 82., 83., 84., 85., 86., 87., 88., 89., 90., 91., 92., 93.,
       94., 95., 96., 97., 98.])
In [72]:
data['user_score'].sort_values().unique()
Out[72]:
array([-1. ,  0. ,  0.2,  0.3,  0.5,  0.6,  0.7,  0.9,  1. ,  1.1,  1.2,
        1.3,  1.4,  1.5,  1.6,  1.7,  1.8,  1.9,  2. ,  2.1,  2.2,  2.3,
        2.4,  2.5,  2.6,  2.7,  2.8,  2.9,  3. ,  3.1,  3.2,  3.3,  3.4,
        3.5,  3.6,  3.7,  3.8,  3.9,  4. ,  4.1,  4.2,  4.3,  4.4,  4.5,
        4.6,  4.7,  4.8,  4.9,  5. ,  5.1,  5.2,  5.3,  5.4,  5.5,  5.6,
        5.7,  5.8,  5.9,  6. ,  6.1,  6.2,  6.3,  6.4,  6.5,  6.6,  6.7,
        6.8,  6.9,  7. ,  7.1,  7.2,  7.3,  7.4,  7.5,  7.6,  7.7,  7.8,
        7.9,  8. ,  8.1,  8.2,  8.3,  8.4,  8.5,  8.6,  8.7,  8.8,  8.9,
        9. ,  9.1,  9.2,  9.3,  9.4,  9.5,  9.6,  9.7])

Категории рейтинга ESRB¶

Пропуски в значениях признака rating заполним значением-меткой 'nd' (no data).

Пропуски в этом признаке могли возникнуть из-за того, что во первых, организация ESRB ведёт свою деятельность с 1994 года, и некоторые игры, вышедшие на рынок раньше, не прошли процедуру присвоения рейтинга. Во-вторых, ESRB ведёт свою деятельность на территории США, и некоторые игры, которые распространялись только на территории других регионов и не попали на территорию США, могли не попасть в "поле зрения" организации. Поэтому для них не была проведена оценка.

In [73]:
data['rating'].fillna('nd', inplace=True)
data['rating'].sort_values().unique()
Out[73]:
array(['ao', 'e', 'e10+', 'ec', 'm', 'nd', 'rp', 't'], dtype=object)
In [74]:
show_na()
Всего пропусков %
name 0 0.0
platform 0 0.0
year_of_release 0 0.0
genre 0 0.0
na_sales 0 0.0
eu_sales 0 0.0
jp_sales 0 0.0
other_sales 0 0.0
critic_score 0 0.0
user_score 0 0.0
rating 0 0.0

Обогащение данных¶

Создание производных признаков¶

Рассчитаем общий (мировой) объём продаж для каждой игры. Создадим признак total_sales.

In [75]:
data['total_sales'] = data.loc[:,['na_sales','eu_sales', 'jp_sales', 'other_sales']].sum(axis=1)

Проверим, согласованы ли значения объёмов продаж.

In [76]:
data[['na_sales', 'eu_sales', 'jp_sales', 'other_sales', 'total_sales']].sample(7)
Out[76]:
na_sales eu_sales jp_sales other_sales total_sales
4597 0.35 0.05 0.00 0.02 0.42
8478 0.12 0.03 0.00 0.01 0.16
13566 0.03 0.01 0.00 0.00 0.04
3009 0.00 0.00 0.67 0.00 0.67
4125 0.23 0.18 0.00 0.06 0.47
7664 0.00 0.00 0.20 0.00 0.20
12251 0.00 0.00 0.07 0.00 0.07

Проверим, нет ли среди них игр с нулевым объёмом продаж в мире.

In [77]:
data[data['total_sales'] == 0]
Out[77]:
name platform year_of_release genre na_sales eu_sales jp_sales other_sales critic_score user_score rating total_sales
16676 g1 jockey 4 2008 ps3 2008 sports 0.0 0.0 0.0 0.0 -1.0 -1.0 nd 0.0
16709 score international baja 1000: the official game ps2 2008 racing 0.0 0.0 0.0 0.0 -1.0 -1.0 nd 0.0

Удалим записи с отсутствующими данными о продажах.

In [78]:
data.drop(index=data[data['total_sales'] == 0].index, inplace=True)
data[data['total_sales'] == 0].shape[0]
Out[78]:
0

Сопоставим каждой категории рейтинга ESRB минимальный возраст пользователя. Создадим признак age (возрастные категории).
Если нет данных о том, какая категория рейтинга присвоена игре (т. е. значение рейтинга — 'nd'), то в качестве возраста укажем значение-метку (−1).
Играм, которым ещё не присвоена постоянная категория, но которые проходят оценку (т. е. значение рейтинга — 'rp'), сопоставим значение-метку 100. Она, с одной стороны, является таким же положительным числом как и любой возраст, но с другой стороны является "ограничителем" минимального возраста и, таким образом, индикатором.

In [79]:
def set_age(value):

    if value == 'e':
        return 0
    if value == 'ec':
        return 3
    if value == 'e10+':
        return 10
    if value == 't':
        return 13
    if value == 'm':
        return 17
    if value == 'ao':
        return 18
    if value == 'rp':
        return 100
    if value == 'nd':
        return -1
In [80]:
data['age'] = data['rating'].apply(set_age)
data['age'].sort_values().unique()
Out[80]:
array([ -1,   0,   3,  10,  13,  17,  18, 100])

Проверим, согласованы ли значения признаков rating и age.

In [81]:
data[['rating', 'age']].sample(7)
Out[81]:
rating age
15493 nd -1
3411 nd -1
15968 nd -1
9674 m 17
9016 t 13
12530 e 0
5706 nd -1

Категоризация данных¶

В соответствии с названием приставки введём категории поколений игровых систем. Для персональных компьютеров введём деление на поколения в соответствии с годами. Создадим признак generation.

In [82]:
def set_generation(value, year):

    if value in ['2600']:
        return 2
    if value in ['nes']:
        return 3
    if value in ['gb', 'gg', 'gen', 'snes', 'ng', 'scd', 'tg16']:
        return 4
    if value in ['3do', 'n64', 'pcfx', 'ps', 'sat', 'ws']:
        return 5
    if value in ['dc', 'gba', 'gc', 'ps2', 'xb']:
        return 6
    if value in ['ds', 'ps3', 'psp', 'wii', 'x360']:
        return 7
    if value in ['3ds', 'ps4', 'psv', 'wiiu', 'xone']:
        return 8
    if value in ['pc']:
        if year > 2011:
            return 8
        if 2003 < year <= 2011:
            return 7
        if 1997 < year <= 2003:
            return 6
        if 1993 < year <= 1997:
            return 5
        if 1986 < year <= 1993:
            return 4
        if 1982 < year <= 1986:
            return 3
        if year <= 1982:
            return 2
In [83]:
data['generation'] = \
data[['platform', 'year_of_release']].apply(lambda x: set_generation(*x), axis=1)

data['generation'].sort_values().unique()
Out[83]:
array([2, 3, 4, 5, 6, 7, 8])

Добавим сведения о производителе платформы для компьютерных игр. Создадим признак producer.
Для платформы "персональный компьютер" оставим значение 'pc', поскольку установить для таких записей производителя не представляется возможным.

In [84]:
def set_producer(value):

    if value in ['2600']:
        return 'atari'
    if value in ['nes', 'gb', 'snes', 'n64', 'gba', 'gc', 'ds', 'wii', '3ds', 'wiiu']:
        return 'nintendo'
    if value in ['gen', 'scd', 'sat', 'dc', 'gg']:
        return 'sega'
    if value in ['ng']:
        return 'snk'
    if value in ['tg16', 'pcfx']:
        return 'nec'
    if value in ['3do']:
        return 'panasonic'
    if value in ['ps', 'ps2', 'ps3', 'psp', 'ps4', 'psv']:
        return 'sony'
    if value in ['ws']:
        return 'bandai'
    if value in ['xb', 'x360', 'xone']:
        return 'microsoft'
    if value in ['pc']:
        return 'pc'
In [85]:
data['producer'] = data['platform'].apply(set_producer)
data['producer'].sort_values().unique()
Out[85]:
array(['atari', 'bandai', 'microsoft', 'nec', 'nintendo', 'panasonic',
       'pc', 'sega', 'snk', 'sony'], dtype=object)

Последние приготовления.

Отсортируем записи по значению года выпуска игры в хронологическом порядке и проиндексируем записи непрерывным рядом значений.

In [86]:
data = data.sort_values(by='year_of_release').reset_index(drop=True)
In [87]:
data.head()
Out[87]:
name platform year_of_release genre na_sales eu_sales jp_sales other_sales critic_score user_score rating total_sales age generation producer
0 indy 500 2600 1977 racing 0.26 0.01 0.0 0.00 -1.0 -1.0 nd 0.27 -1 2 atari
1 combat 2600 1977 action 1.17 0.07 0.0 0.01 -1.0 -1.0 nd 1.25 -1 2 atari
2 circus atari 2600 1977 action 0.43 0.03 0.0 0.00 -1.0 -1.0 nd 0.46 -1 2 atari
3 air-sea battle 2600 1977 shooter 0.91 0.06 0.0 0.01 -1.0 -1.0 nd 0.98 -1 2 atari
4 breakaway iv 2600 1978 puzzle 0.20 0.01 0.0 0.00 -1.0 -1.0 nd 0.21 -1 2 atari
In [88]:
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 16591 entries, 0 to 16590
Data columns (total 15 columns):
 #   Column           Non-Null Count  Dtype  
---  ------           --------------  -----  
 0   name             16591 non-null  object 
 1   platform         16591 non-null  object 
 2   year_of_release  16591 non-null  int64  
 3   genre            16591 non-null  object 
 4   na_sales         16591 non-null  float64
 5   eu_sales         16591 non-null  float64
 6   jp_sales         16591 non-null  float64
 7   other_sales      16591 non-null  float64
 8   critic_score     16591 non-null  float64
 9   user_score       16591 non-null  float64
 10  rating           16591 non-null  object 
 11  total_sales      16591 non-null  float64
 12  age              16591 non-null  int64  
 13  generation       16591 non-null  int64  
 14  producer         16591 non-null  object 
dtypes: float64(7), int64(3), object(5)
memory usage: 1.9+ MB

Промежуточный вывод

  • Выполнена предварительная обработка данных.
  • В результате предварительной обработки данных:
    • обработаны аномальные значения, противоречащие физической природе данных,
    • устранены ошибки в значениях признаков,
    • удалены записи с несогласующимися значениями и дополнительными значениями в наименованиях компьютерных игр, которые противоречат основным данным,
    • извлечены вложенные сведения из признаков,
    • объединены записи, относящиеся к одному объекту,
    • заполнены пропуски наиболее подходящим значением,
    • в записях, в которых не удалось подобрать подходящее значение, пропуски заполнены фиктивными значениями-метками, не противоречащими остальным данным,
    • типы данных приведены в соответствии с физической природой данных и шкалами их измерения,
    • обнаружены и удалены полные и частичные дубликаты,
    • сохранено 99,3 % записей исходного набора данных,
    • данные обогащены путём создания новых признаков и категоризации данных существующих признаков.

Исследовательский анализ данных¶

Описательный анализ данных¶

Предварительно зададим функцию, рассчитывающую описательные статистики.

In [89]:
def descriptive_statistics(values, label):
    '''
    Описательная статистика переменной, измеряемой в количественной шкале.

    Принимает значения признака и название признака.
    Возвращает DataFrame с набором статистик.

    '''

    df = pd.DataFrame([
        values.count(),
        len(values.unique()),
        values.min(),
        values.median() - 1.5 * (values.quantile(q=.75) -
                                 values.quantile(q=.25)),
        values.quantile(q=.25).round(2),
        (values.mode()).to_list(),
        values.median().round(2),
        values.mean().round(2),
        values.quantile(q=.75).round(2),
        values.median() + 1.5 * (values.quantile(q=.75) -
                                 values.quantile(q=.25)),
        values.max(),
        values.max() - values.min(),
        values.quantile(q=.75) - values.quantile(q=.25)
    ],
        index=['кол-во значений', 'кол-во уникальных', 'мин.',
               '-1.5IQR', '25 %', 'мода', 'медиана',
               'среднее ариф.', '75 %', '+1.5IQR', 'макс.',
               'размах', 'межквартильный размах'],
        columns=[label])

    return df

Характеристики компьютерных игр¶

Название игры¶

Описательная статистика.

In [90]:
pd.DataFrame(data['name'].describe()).rename(
    index={'count': 'кол-во значений',
           'unique': 'кол-во уникальных',
           'top': 'мода',
           'freq': 'частота моды'},
    columns={'name': 'Название игры'})
Out[90]:
Название игры
кол-во значений 16591
кол-во уникальных 11431
мода need for speed: most wanted
частота моды 12

Диаграмма размаха.

In [91]:
data['name'].value_counts().plot.box(
    title='Диаграмма размаха\nрапределения количества упоминаний\nназвания игры',
    label='Название игры',
    ylabel='Частота упоминаний',
    yticks=[2 * n + 1 for n in range(6)],
    figsize=(3, 3))
plt.show()

Круговая диаграмма распределения игр по количеству упоминаний в наборе данных.

In [92]:
(data['name'].value_counts() > 1).value_counts().rename(
    index={0: '1', 1: '2+'}).plot.pie(
    title='Круговая диаграмма\nраспределения игр\nпо количеству упоминаний',
    label='', figsize=(10, 3))
plt.show()

Таблица относительных частот.

In [93]:
pd.DataFrame((data['name'].value_counts() > 1).value_counts() /
             len(data['name'].unique()) * 100).round(0).astype('int').rename(
    index={0: '1 раз', 1: '2 и более раз'},
    columns={'name': 'Относительная частота, %'}).T
Out[93]:
1 раз 2 и более раз
Относительная частота, % 75 25

Диаграмма распределения частот.

In [94]:
data['name'].value_counts().value_counts().plot.bar(
    title='Диаграмма распределения количества упоминаний названия игры',
    xlabel='Количество упоминаний названия игры',
    ylabel='Количество игр',
    rot=0, figsize=(10, 3))
plt.show()

Таблица частоты встречаемости наименований компьютерных игр.

In [95]:
pd.DataFrame(
    data['name'].value_counts().value_counts()
).T.rename(index={'name': 'количество игр'})
Out[95]:
1 2 3 4 5 6 7 8 9 12
количество игр 8624 1521 720 278 151 87 32 13 4 1

Таблица распределения частот (топ-5).

In [96]:
pd.DataFrame(
    data['name'].value_counts().head()
).rename(columns={'name': 'частота'})
Out[96]:
частота
need for speed: most wanted 12
madden nfl 07 9
ratatouille 9
fifa 14 9
lego marvel super heroes 9
  • Количество уникальных наименований компьютерных игр — 11 431. Это значит, что во всём наборе данных (16 591 запись) некоторые наименования игр встречаются более одного раза.
  • Количество игр, выпущенных один раз, составляет 8624 наименований — это 75 % от общего числа всех игр. 25 % оставшихся игр (2807 наименований) были выпущены несколько раз: в разные годы и/или для разных платформ.
  • Игра Need for speed: most wanted упоминается в наборе данных 12 раз — самое частое упоминание среди всех игр. Кроме неё в топ-5 по частоте упоминаний входят игры, которые в наборе данных встречались 9 раз (Lego marvel super heroes, FIFA 14, Ratatouille, Madden NFL 07).
  • Распределение частот упоминаний компьютерных игр в наборе данных имеет экспоненциальный характер: всё меньше различных игр выпускается для большого количества различных платформ или перевыпускается в другие годы. В основном, большая часть игр выпускается единожды, для одной или максимум двух платформ.
Год выпуска игры¶

Описательная статистика.

In [97]:
descriptive_statistics(data['year_of_release'], 'Год выпуска')
Out[97]:
Год выпуска
кол-во значений 16591
кол-во уникальных 40
мин. 1977
-1.5IQR 1996.5
25 % 2003.0
мода [2009]
медиана 2007.0
среднее ариф. 2006.47
75 % 2010.0
+1.5IQR 2017.5
макс. 2016
размах 39
межквартильный размах 7.0

Диаграмма размаха.

In [98]:
data['year_of_release'].value_counts().plot.box(
    title='Диаграмма размаха\nраспределения количества игр,\nвыпускаемых в год',
    label='Год выпуска',
    ylabel='Количество игр в год',
    figsize=(3, 3))
plt.show()

Диаграмма распределения частот.

In [99]:
data['year_of_release'].value_counts().sort_index().plot.bar(
    rot=0,
    title='Диаграмма распределения игр по году выпуска',
    xlabel='Год выпуска',
    ylabel='Частота',
    figsize=(10, 3))
plt.xticks([3, 8, 13, 18, 23, 28, 33, 38])
plt.show()

Таблица распределения частот (топ-10).

In [100]:
pd.DataFrame(data['year_of_release'].value_counts()).head(10).sort_index().T.rename(
    index={'year_of_release': 'количество игр'})
Out[100]:
2002 2003 2004 2005 2006 2007 2008 2009 2010 2011
количество игр 848 786 768 936 997 1193 1432 1437 1283 1179
  • Рассмотренные компьютерные игры выпускались каждый год в период с 1977 по 2016 года. Это значит, что временной интервал для анализа — 40 лет.
  • Большинство игр выпускалось в период с 1997 по 2016 года, то есть в течение последних 20 лет.
  • Наиболее продуктивными, то есть в которые выходило наибольшее число игр, были года с 2002 по 2011 — продуктивная десятилетка. В это время стабильно в свет выходило не менее 750 игр в год.
  • Причём половина всех игр в наборе данных было выпущено в период с 2003 по 2010 года — за 8 лет.
  • Самыми "урожайными" на новые игры явились 2008 и 2009 годы, тогда было выпущено 1432 и 1437 игр, соответственно.
  • Наименее активными были 1977–1990 года, тогда выпускалось не более 50 игр в год.
  • Рост количества выпускаемых в год игр стал заметен в середине 1990-х годов. К 2000-му году количество выпускаемых в год игр перевалило за 300 и к этому моменту не снижалось уже на протяжении трёх лет.
  • С ещё большими темпами рост наблюдался в 2000-х годах и к концу первого десятилетия XXI века достиг своего максимума.
  • Своеобразным экватором стал 2007 год: к этому моменту было произведено 50 % всех игр из набора данных, остальные 50 % были выпущены на рынок с 2007 по 2016 года. Таким образом, за последние 10 лет мир увидел половину из когда-либо выпущенных компьютерных игр. А индустрия компьютерных игр воспроизвела свой объём.
  • После 2011 года количество выпускаемых в год игр сократилось в два раза и к 2016 году сохраняется на уровне 600 новых игр в год с колебаниями $\pm$50 игр в год.
Название платформы¶

Описательная статистика.

In [101]:
pd.DataFrame(data['platform'].describe()).rename(
    index={'count': 'кол-во значений',
           'unique': 'кол-во уникальных',
           'top': 'мода',
           'freq': 'частота моды'},
    columns={'platform': 'Название платформы'})
Out[101]:
Название платформы
кол-во значений 16591
кол-во уникальных 31
мода ps2
частота моды 2128

Диаграмма размаха.

In [102]:
data['platform'].value_counts().plot.box(
    title='Диаграмма размаха\nраспределения частоты\nвстречаемости платформ',
    label='Платформа',
    ylabel='Количество игр\nдля платформы',
    figsize=(3, 3))
plt.show()

Диаграмма распределения частот.

In [103]:
data['platform'].value_counts().plot.bar(
    rot=0,
    title='Диаграмма распределения игр по платформам',
    xlabel='Название платформы',
    ylabel='Частота',
    figsize=(12, 3))
plt.show()

Таблица распределения частот (топ-10).

In [104]:
df = pd.DataFrame(data['platform'].value_counts()).head(10).T.join(
    pd.DataFrame(pd.DataFrame(data['platform'].value_counts().head(10)).sum()))
df.rename(index={'platform': 'количество игр'}, columns={0: 'всего'})
Out[104]:
ps2 ds ps3 wii x360 ps psp pc xb gba всего
количество игр 2128 2115 1327 1312 1256 1196 1192 974 820 817 13137
  • Все компьютерные игры в наборе данных можно запускать на 31 игровой платформе:
    • 30 из них представляют собой игровые приставки,
    • ещё 1 игровая платформа — это персональный компьютер.
  • Все игровые платформы можно разделить на три группы в зависимости от количества выпущенных для них игр.
    • Для 10 платформ выпущено не менее 800 игр (1 группа).
    • Ещё для 10 платформ выпущено от 100 до 550 игр (2 группа).
    • Для оставшиеся 11 платформ выпущено менее 100 игр (3 группа).
  • Лидерами среди игровых платформ по количеству выпущенных для них игр являются Sony PlayStation 2 и Nintendo DS.
    • Для Sony PlayStation 2 было выпущено 2128 игры — это почти 13 % всех игр.
    • Для Nintendo DS было выпущено 2115 игры — и это почти 13 % всех игр.
    • Суммарно на лидеров приходится около 25 % всех игр.
  • Кроме этих платформ в топ-10 по количеству выпущенных игр входят Sony PlayStation и PlayStation 3, Nintendo Wii и Microsoft Xbox 360. Для каждой из них было выпущено около 1250 игр — это в 1,7 раз меньше по сравнению с лидерами.
  • Для остальных платформ выпущено менее 1000 игр. Здесь своеобразной границей служит выступающий в качестве игровой платформы персональный компьютер. Для него было выпущено 974 игры.
  • Замыкают топ-10 платформы Microsoft Xbox и Nintendo Game Boy Advance — для них было выпущено 820 и 817 игр, соответственно.
  • Для игровых платформ, входящих в топ-10, общее количество выпущенных игр составляет 13 137 — это 79 % всех компьютерных игр.
  • Остальные 3454 игры выпущены для 21 платформы:
    • Из третьей группы:
      • 6 платформ встречаются в наборе данных не более 10 раз.
      • Ещё для 5 платформ количество выпущенных игр составляет от 10 до 100.
    • Из второй группы:
      • 5 платформ встречаются в наборе данных от 100 до 250 раз.
      • Ещё для 5 платформ количество выпущенных игр составляет от 250 до 550.
Поколения игровых систем¶

Описательная статистика.

In [105]:
descriptive_statistics(data['generation'], 'Поколения игровых систем')
Out[105]:
Поколения игровых систем
кол-во значений 16591
кол-во уникальных 7
мин. 2
-1.5IQR 5.5
25 % 6.0
мода [7]
медиана 7.0
среднее ариф. 6.51
75 % 7.0
+1.5IQR 8.5
макс. 8
размах 6
межквартильный размах 1.0

Диаграмма размаха.

In [106]:
data['generation'].plot.box(
    title='Диаграмма размаха\nраспределения игр\nпо номеру поколения игровых систем',
    label='Название игры',
    ylabel='Поколение игровых систем',
    figsize=(3, 3))
plt.show()

Диаграмма распределения частот.

In [107]:
data['generation'].value_counts().sort_index().plot.bar(
    rot=0,
    title='Диаграмма распределения игр\nпо номеру поколения игровых систем',
    xlabel='Поколение игровых систем',
    ylabel='Частота',
    figsize=(6, 3))
plt.show()

Таблица распределения частот.

In [108]:
pd.DataFrame(data['generation'].value_counts().sort_index()).T.rename(
    index={'generation': 'количество игр'})
Out[108]:
2 3 4 5 6 7 8
количество игр 133 99 389 1712 4461 7805 1992
  • Всего в наборе данных можно выделить 7 поколений игровых систем: со 2-го по 8-е поколение.
  • Для 2-го и 3-го поколений игровых систем выпускалось около 100–150 игр.
  • Начиная с 4-го поколения игровых систем количество выпускавшихся игр начало расти. И каждый раз, при переходе к игровым системам следующего поколения количество выпускавшихся игр увеличивалось почти в два раза.
  • Максимальное количество игр — 7805 — было выпущено для игровых систем 7-го поколения, что составило около 50 % всех выпущенных игр.
  • Количество игр 8-го поколения снизилось почти в два раза по сравнению с 7-ым поколением. Однако 8-е поколение является текущим, и игры для систем этого поколения продолжают выпускаться. Поэтому итоговые оценки по 8-му поколению делать рано.
Производитель платформ¶

Описательная статистика.

In [109]:
pd.DataFrame(data['producer'].describe()).rename(
    index={'count': 'кол-во значений',
           'unique': 'кол-во уникальных',
           'top': 'мода',
           'freq': 'частота моды'},
    columns={'producer': 'Производитель платформ'})
Out[109]:
Производитель платформ
кол-во значений 16591
кол-во уникальных 10
мода sony
частота моды 6665

Диаграмма размаха.

In [110]:
data['producer'].value_counts().plot.box(
    title='Диаграмма размаха\nчастоты встречаемости\nпроизводителя платформ',
    label='Производитель платформы',
    ylabel='Количество игр\nдля платформ одного производителя',
    figsize=(3, 5))
plt.show()

Диаграмма распределения частот.

In [111]:
data['producer'].value_counts().plot.bar(
    rot=0,
    title='Диаграмма распределения игр по производителям платформ',
    xlabel='Производитель платформ',
    ylabel='Частота',
    figsize=(10, 3))
plt.show()

Таблица распределения частот.

In [112]:
pd.DataFrame(data['producer'].value_counts()).T.rename(
    index={'producer': 'количество игр'})
Out[112]:
sony nintendo microsoft pc sega atari snk bandai panasonic nec
количество игр 6665 6214 2323 974 258 133 12 6 3 3
  • Все 30 игровых приставок, упомянутых в наборе данных, были выпущены 9 производителями. Среди них можно выделить тройку лидеров: Sony, Nintendo и Microsoft. Именно они на сегодняшний день продолжают свою деятельность в индустрии игровых консолей.
  • Всего на тройку лидеров приходится 15 202 выпущенные игры — это более 91 % всех игр.
  • Наибольшее количество игр было выпущено для игровых приставок производства Sony и Nintendo — 6665 и 6214 игр, соответственно. Это 40 % и 37 % от общего числа игр, соответственно.
  • Замыкает тройку лидеров Microsoft: для приставок её производства было выпущено игр почти в 3 раза меньше — 2323 игры, что составляет 14 % от всех игр.
  • Для приставок остальных компаний разработчики перестали выпускать игры.
Жанр игры¶

Описательная статистика.

In [113]:
pd.DataFrame(data['genre'].describe()).rename(
    index={'count': 'кол-во значений',
           'unique': 'кол-во уникальных',
           'top': 'мода',
           'freq': 'частота моды'},
    columns={'genre': 'Жанр игры'})
Out[113]:
Жанр игры
кол-во значений 16591
кол-во уникальных 12
мода action
частота моды 3346

Диаграмма размаха.

In [114]:
data['genre'].value_counts().plot.box(
    title='Диаграмма размаха\nраспределения частоты\nвстречаемости жанра',
    label='Жанр',
    ylabel='Количество игр\nкаждого жанра',
    figsize=(3, 3))
plt.show()

Диаграмма распределения частот.

In [115]:
data.loc[data['genre'] != 'misc', 'genre'].value_counts().plot.bar(
    rot=0,
    title='Диаграмма распределения игр по жанрам',
    xlabel='Жанр игры',
    ylabel='Частота',
    figsize=(10, 3))
plt.show()

Таблица распределения частот.

In [116]:
pd.DataFrame(data['genre'].value_counts()).T.rename(
    index={'genre': 'количество игр'})
Out[116]:
action sports misc role-playing shooter adventure racing platform simulation fighting strategy puzzle
количество игр 3346 2331 1738 1473 1318 1297 1244 883 864 838 681 578
  • Для игр, представленных в наборе данныx, можно выделить 11 основных жанров. К таким жанрам относится 14 853 игры, или 90 % всех игр.
  • Игры других жанров или такие, для которых нельзя однозначно выделить какой-то жанр в качестве основного, собрала в себе категория 'miscellaneous' (разное). Таких игр 1738, что составляет 10 % всех игр.
  • Наибольшее количество игр представлено в жанре экшен — это 3346 игры, что составляет 20 % всех игр.
  • Примерно в 1,5 раза меньше представлено спортивных игр — 2331 игра.
  • Вместе на двух лидеров приходится 34 % всех выпущенных игр.
  • В 2 раза меньше, чем у лидера, и на уровне около 1330 игр представлен каждый из жанров: ролевые игры, шутер, квест и гонки.
  • Платформеров, симуляторов и файтингов приблизительно по 850.
  • Замыкают список жанров стратегии и квесты-головоломки. Игр в таких жанрах 681 и 578, соответственно.

Характеристики оценок¶

Оценка пользователей¶

Круговая диаграмма распределения компьютерных игр по наличию оценок пользователей.

In [117]:
(data['user_score'] >= 0).value_counts().rename(
    index={0: 'Оценки нет', 1: 'Оценка есть'}
    ).plot.pie(
    title='Круговая диаграмма\nраспределения компьютерных игр' +
          '\nпо наличию оценок пользователей',
    label='',
    figsize=(10, 3))
plt.show()

Таблица относительных частот.

In [118]:
pd.DataFrame((data['user_score'] >= 0).value_counts() /
             data.shape[0] * 100).round(0).astype('int').rename(
    index={0: 'Оценки нет', 1: 'Оценка есть'},
    columns={'user_score': 'Относительная частота, %'}).T
Out[118]:
Оценки нет Оценка есть
Относительная частота, % 54 46

Описательная статистика.

In [119]:
descriptive_statistics(data.loc[data['user_score'] >= 0, 'user_score'],
                       'Оценка пользователей')
Out[119]:
Оценка пользователей
кол-во значений 7588
кол-во уникальных 95
мин. 0.0
-1.5IQR 4.8
25 % 6.4
мода [7.8]
медиана 7.5
среднее ариф. 7.13
75 % 8.2
+1.5IQR 10.2
макс. 9.7
размах 9.7
межквартильный размах 1.8

Диаграмма размаха.

In [120]:
data.loc[data['user_score'] >= 0, 'user_score'].plot.box(
    title='Диаграмма размаха\nраспределения игр' +
          '\nпо значению оценки пользователя',
    label='Название игры',
    ylabel='Оценка пользователей',
    figsize=(3, 3))
plt.show()

Диаграмма распределения частот.

In [121]:
data.loc[data['user_score'] >= 0, 'user_score'].plot.hist(
    bins=[0.3 * (n + 1) for n in range(35)],
    xticks=[n + 1 for n in range(10)],
    figsize=(10, 3))
plt.title('Диаграмма распределения игр по значению оценки пользователя')
plt.xlabel('Оценка пользователей')
plt.ylabel('Частота')
plt.show()

Таблица распределения частот (топ-10).

In [122]:
pd.DataFrame(
    data.loc[data['user_score'] >= 0, 'user_score'].value_counts()
).head(10).sort_index().T.rename(index={'user_score': 'Количество игр'})
Out[122]:
7.3 7.5 7.7 7.8 7.9 8.0 8.1 8.2 8.3 8.5
Количество игр 236 251 240 324 249 290 244 282 254 253
  • Из всех игр набора данных только для 46 % пользователи поставили оценку. Таких игр 7587.
  • Минимальная выставленная оценка — 0, максимальная — 9,7.
  • Большинство оценённых игр имеют оценку 4 или больше.
  • Половине всех игр пользователи выставили оценки в диапазоне 6,4–8,2.
  • Причём наибольшее число раз (топ-10) выставлялись оценки от 7,3 до 8,5. Игр с такими оценками — 2623, что составляет 35 % всех оценённых игр.
  • Самая распространённая оценка — 7,8, такую имеют 324 игры.
  • Распределение оценок унимодальное, скошено вправо, к максимальной границе. Максимальное число оценок приходится на интервал 7–9.
  • Пользователи ставили достаточно высокие оценки: в среднем — 7 баллов из 10. А половина всех оценённых игр имеет оценку не ниже 7,5.
  • Это позволяет утверждать, что пользователи достаточно лояльно относятся к тем играм, которые оценивали. И что, вероятно, мотивацией к выставлению оценки послужило именно хорошее впечатление об игре.
Оценка критиков¶

Круговая диаграмма распределения компьютерных игр по наличию оценок критиков.

In [123]:
(data['critic_score'] > 0).value_counts().rename(
    index={0: 'Оценки нет', 1: 'Оценка есть'}
    ).plot.pie(
    title='Круговая диаграмма\nраспределения компьютерных игр' +
          '\nпо наличию оценок критиков',
    label='',
    figsize=(10, 3))
plt.show()

Таблица относительных частот.

In [124]:
pd.DataFrame((data['critic_score'] > 0).value_counts() /
             data.shape[0] * 100).round(0).astype('int').rename(
    index={0: 'Оценки нет', 1: 'Оценка есть'},
    columns={'critic_score': 'Относительная частота, %'}).T
Out[124]:
Оценки нет Оценка есть
Относительная частота, % 51 49

Описательная статистика.

In [125]:
descriptive_statistics(data.loc[data['critic_score'] > 0, 'critic_score'],
                       'Оценка критиков')
Out[125]:
Оценка критиков
кол-во значений 8135
кол-во уникальных 82
мин. 13.0
-1.5IQR 42.5
25 % 60.0
мода [70.0]
медиана 71.0
среднее ариф. 68.97
75 % 79.0
+1.5IQR 99.5
макс. 98.0
размах 85.0
межквартильный размах 19.0

Диаграмма размаха.

In [126]:
data.loc[data['critic_score'] > 0, 'critic_score'].plot.box(
    title='Диаграмма размаха\nраспределения игр\nпо значению оценки критиков',
    label='Название игры',
    ylabel='Оценка критиков',
    figsize=(3, 3))
plt.show()

Диаграмма распределения частот.

In [127]:
data.loc[data['critic_score'] > 0, 'critic_score'].plot.hist(
    bins=[n + 1 for n in range(100)],
    xticks=[10 * n for n in range(11)],
    figsize=(10, 3))
plt.title('Диаграмма распределения игр по значению оценки критиков')
plt.xlabel('Оценка критиков')
plt.ylabel('Частота')
plt.show()

Таблица распределения частот.

In [128]:
pd.DataFrame(
    data.loc[data['critic_score'] > 0, 'critic_score'].value_counts()
).head(10).sort_index().T.rename(index={'critic_score': 'Количество игр'})
Out[128]:
70.0 71.0 72.0 73.0 74.0 75.0 76.0 77.0 78.0 80.0
Количество игр 256 254 226 238 226 245 235 225 240 237
  • Из всех игр набора данных только для 49 % критики поставили оценку. Таких игр 8135.
  • Минимальная выставленная оценка — 13, максимальная — 98.
  • Большинство оценённых игр имеют оценку 37 или больше.
  • Половине всех игр критики выставили оценки в диапазоне 60–79.
  • Причём наибольшее число раз (топ-10) выставлялись оценки от 70 до 80. Игр с такими оценками — 2382, что составляет 29 % всех оценённых игр.
  • Самые распространённые оценки — 70 и 71, такие имеют 256 и 254 игры, соответственно.
  • Распределение оценок унимодальное, скошено вправо, к максимальной границе. Максимальное число оценок приходится на интервал 70–80. Меньшее количество оценок приходится на интервалы 60—70 и 80—90.
  • Критики выставили достаточно высокие оценки: в среднем — 69 баллов из 100. А половина всех оценённых игр имеет оценку не ниже 71.
  • Это позволяет утверждать, что критики составили для себя положительное впечатление об играх и высоко их оценили.
Рейтинг ESRB и возрастные категории¶

Круговая диаграмма распределения компьютерных игр по наличию рейтинга ESRB.

In [129]:
(data['age'] >= 0).value_counts().rename(
    index={0: 'Рейтинга нет', 1: 'Рейтинг есть'}
    ).plot.pie(
    title='Круговая диаграмма\nраспределения компьютерных игр' +
          '\nпо наличию рейтинга ESRB',
    label='',
    figsize=(10, 3))
plt.show()

Таблица относительных частот.

In [130]:
pd.DataFrame((data['age'] >= 0).value_counts() /
             data.shape[0] * 100).round(0).astype('int').rename(
    index={0: 'Оценки нет', 1: 'Оценка есть'},
    columns={'age': 'Относительная частота, %'}).T
Out[130]:
Оценка есть Оценки нет
Относительная частота, % 60 40

Описательная статистика.

In [131]:
pd.DataFrame(data.loc[data['rating'] != 'nd', 'rating'].describe()).rename(
    index={'count': 'кол-во значений',
           'unique': 'кол-во уникальных',
           'top': 'мода',
           'freq': 'частота моды'},
    columns={'rating': 'Рейтинг ESRB'})
Out[131]:
Рейтинг ESRB
кол-во значений 9947
кол-во уникальных 7
мода e
частота моды 3992

Диаграмма размаха.

In [132]:
data.loc[data['age'] >= 0, 'age'].value_counts().plot.box(
    title='Диаграмма размаха\nчастоты встречаемости\nрейтинговой оценки ESRB',
    label='Название игры',
    ylabel='Количество игр\nв каждой категории',
    figsize=(3, 4))
plt.show()

Диаграмма распределения частот.

In [133]:
data.loc[data['age'] >= 0, 'age'].value_counts().sort_index().plot.bar(
    rot=0,
    title='Диаграмма распределения игр по значению минимального возраста',
    xlabel='Минимальный возраст (согласно рейтингу ESRB)',
    ylabel='Частота',
    figsize=(10, 3))
plt.show()

Таблица распределения частот.

In [134]:
pd.DataFrame(
    data.loc[data['age'] >= 0, 'age'].value_counts().sort_index()
).T.rename(index={'age': 'количество игр'})
Out[134]:
0 3 10 13 17 18 100
количество игр 3992 8 1419 2961 1563 1 3
  • Из всех игр набора данных только 60 % игр ESRB присвоила рейтинг и возрастную категорию. Таких игр 9947.
  • Наибольшему числу игр присвоена категория Everyone ("Для всех"). Таких игр 3992, что составляет 40 % всех игр с присвоенной категорией.
  • Следующая по ёмкости категория — Teen ("Для подростков от 13 лет"). Она присвоена 2961 игре, что составляет 30 % всех игр с присвоенной категорией.
  • Затем идут приблизительно равные по ёмкости категории: Everyone 10+ ("Для детей от 10 лет"), количество игр с такой категорией — 1419; Mature 17+ ("Для подростков от 17 лет"), количество игр с такой категорией — 1563. Совместно на эти категории приходится 30 % всех оценённых игр.
  • Категорию Early Childhood ("Для детей младшего возраста") организация присвоила только 8 играм. Она не нашла своего широкого применения.
  • Категорию Adult Only 18+ ("Для взрослых") организация присвоила только 1 игре.
  • Ещё 3 игры проходят процедуру присвоения рейтинга. Их оценка на момент сбора данных ещё не была закончена.

Распределение пропусков в значениях оценок критиков и пользователей и в значениях рейтинга ESRB

In [135]:
sns.heatmap(
    data.replace([-1, 'nd'], np.nan).sort_values(
        by=['rating', 'producer', 'platform'], ascending=False).isna(),
    cmap=sns.color_palette(['#000000', '#ffffff'])
)
plt.title('Тепловая карта распределения пропущенных значений')
plt.xlabel('Название признака')
plt.ylabel('Номер записи')
plt.show()
  • Удивительно, но факт: игры, которым не был присвоен рейтинг ESRB, почти все остаются неоценёнными критиками и пользователями.
  • Среди игр, у которых есть рейтинговая категория ESRB, критики и пользователи, по-видимому, не стали уделять большого внимания определённым игровым платформам определённых производителей. Поэтому пропуски удаётся сгруппировать на тепловой карте.

Характеристики продаж¶

Общие (мировые) продажи¶

Описательная статистика.

In [136]:
descriptive_statistics(data['total_sales'], 'Продажи в мире, млн копий')
Out[136]:
Продажи в мире, млн копий
кол-во значений 16591
кол-во уникальных 1007
мин. 0.01
-1.5IQR -0.445
25 % 0.06
мода [0.02]
медиана 0.17
среднее ариф. 0.54
75 % 0.47
+1.5IQR 0.785
макс. 82.54
размах 82.53
межквартильный размах 0.41

Диаграмма размаха.

In [137]:
data['total_sales'].plot.box(
    title='Диаграмма размаха\nраспределения игр\nпо общим (мировым) продажам',
    label='Название игры',
    ylabel='Продажи, млн копий',
    ylim=(0, 1.25),
    figsize=(3, 3))
plt.show()

Диаграмма распределения частот.

In [138]:
data.loc[data['total_sales'] < 1, 'total_sales'].plot.hist(figsize=(10, 3))
plt.title('Диаграмма распределения игр по общим (мировым) продажам')
plt.xlabel('Продажи, млн копий')
plt.ylabel('Частота')
plt.show()

Таблица распределения частот.

In [139]:
pd.DataFrame(
    data.loc[data['total_sales'] > 0, 'total_sales'].value_counts().head(10).sort_index()
    ).T.rename(index={'total_sales': 'количество игр'})
Out[139]:
0.01 0.02 0.03 0.04 0.05 0.06 0.08 0.09 0.11 0.13
количество игр 782 1018 799 647 633 313 484 327 382 365
  • Всего в мире было продано более 8,9 млрд копий компьютерных игр.
  • Минимальное количество проданных в мире копий одной игры — 10 тыс., максимальное — 82,54 млн.
  • Распределение объёмов мировых продаж имеет экспоненциальный характер: количество игр, имеющих высокий объём продаж, уменьшается с ростом этого объёма.
  • В среднем, в мире, игры продавались в объёме 170 тыс. копий каждая.
  • Большинство игр было продано в мире в объёме не более 1,1 млн копий каждая. Игры, проданные в большем объёме, — явление редкое.
  • Половина всех игр продавалась в мире в объёме 60–470 тыс. копий.
  • Наиболее часто игры продаются в мире в объёме 10–130 тыс. копий.
  • Самое встречаемое значение в наборе данных — 20 тыс. копий. В таком объёме в мире были проданы каждая из 1018 игр.
Продажи в Северной Америке¶

Круговая диаграмма распределения компьютерных игр по продажам в Северной Америке.

In [140]:
(data['na_sales'] > 0).value_counts().rename(
    index={0: 'Продаж не было', 1: 'Продажи были'}
    ).plot.pie(
    title='Круговая диаграмма\nраспределения игр\nпо продажам в Северной Америке',
    label='',
    figsize=(10, 3))
plt.show()

Таблица относительных частот.

In [141]:
pd.DataFrame((data['na_sales'] > 0).value_counts() /
             data.shape[0] * 100).round(0).astype('int').rename(
    index={0: 'Продаж не было', 1: 'Продажи были'},
    columns={'na_sales': 'Относительная частота, %'}).T
Out[141]:
Продажи были Продаж не было
Относительная частота, % 73 27

Описательная статистика.

In [142]:
descriptive_statistics(data.loc[data['na_sales'] > 0, 'na_sales'],
                       'Продажи в Северной Америке, млн копий')
Out[142]:
Продажи в Северной Америке, млн копий
кол-во значений 12185
кол-во уникальных 405
мин. 0.01
-1.5IQR -0.28
25 % 0.06
мода [0.02]
медиана 0.14
среднее ариф. 0.36
75 % 0.34
+1.5IQR 0.56
макс. 41.36
размах 41.35
межквартильный размах 0.28

Диаграмма размаха.

In [143]:
data.loc[data['na_sales'] > 0, 'na_sales'].plot.box(
    title='Диаграмма размаха\nраспределения игр\nпо продажам в Северной Америке',
    label='Название игры',
    ylabel='Продажи, млн копий',
    ylim=(0, 1),
    figsize=(3, 3))
plt.show()

Диаграмма распределения частот.

In [144]:
data.loc[(data['na_sales'] > 0) & (data['na_sales'] < 1), 'na_sales'].plot.hist(figsize=(10, 3))
plt.title('Диаграмма распределения игр по продажам в Северной Америке')
plt.xlabel('Продажи, млн копий')
plt.ylabel('Количество игр')
plt.show()

Таблица распределения частот.

In [145]:
pd.DataFrame(
    data.loc[data['na_sales'] > 0, 'na_sales'].value_counts().head(10).sort_index()
).T.rename(index={'na_sales': 'количество игр'})
Out[145]:
0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.10
количество игр 544 574 559 546 542 502 489 444 432 406
  • В Северной Америке было продано только 73 % всех игр — это 12 185 наименований.
  • Минимальное количество проданных в Северной Америке копий одной игры — 10 тыс., максимальное — 41,36 млн.
  • Распределение объёмов продаж в Северной Америке имеет экспоненциальный характер: количество игр, имеющих высокий объём продаж, уменьшается с ростом этого объёма.
  • В среднем, в Северной Америке, игры продавались в объёме 140 тыс. копий каждая.
  • Большинство игр было продано в Северной Америке в объёме не более 750 тыс. копий каждая. Игры, проданные в большем объёме, — явление редкое.
  • Половина всех игр продавалась в Северной Америке в объёме 60–340 тыс. копий.
  • Наиболее часто игры продаются в Северной Америке в объёме 10–100 тыс. копий.
  • Самое встречаемое значение в наборе данных — 20 тыс. копий. В таком объёме в Северной Америке были проданы каждая из 574 игр.
Продажи в Европе¶

Круговая диаграмма распределения компьютерных игр по продажам в Европе.

In [146]:
(data['eu_sales'] > 0).value_counts().rename(
    index={0: 'Продаж не было', 1: 'Продажи были'}
    ).plot.pie(
    title='Круговая диаграмма\nраспределения игр\nпо продажам в Европе',
    label='',
    figsize=(10, 3))
plt.show()

Таблица относительных частот.

In [147]:
pd.DataFrame((data['eu_sales'] > 0).value_counts() /
             data.shape[0] * 100).round(0).astype('int').rename(
    index={0: 'Продаж не было', 1: 'Продажи были'},
    columns={'eu_sales': 'Относительная частота, %'}).T
Out[147]:
Продажи были Продаж не было
Относительная частота, % 65 35

Описательная статистика.

In [148]:
descriptive_statistics(data.loc[data['eu_sales'] > 0, 'eu_sales'],
                       'Продажи в Европе, млн копий')
Out[148]:
Продажи в Европе, млн копий
кол-во значений 10825
кол-во уникальных 308
мин. 0.01
-1.5IQR -0.2
25 % 0.02
мода [0.01]
медиана 0.07
среднее ариф. 0.22
75 % 0.2
+1.5IQR 0.34
макс. 28.96
размах 28.95
межквартильный размах 0.18

Диаграмма размаха.

In [149]:
data.loc[data['eu_sales'] > 0, 'eu_sales'].plot.box(
    title='Диаграмма размаха\nраспределения игр\nпо продажам в Европе',
    label='Название игры',
    ylabel='Продажи, млн копий',
    ylim=(0, 1),
    figsize=(3, 3))
plt.show()

Диаграмма распределения частот.

In [150]:
data.loc[(data['eu_sales'] > 0) & (data['eu_sales'] < 1), 'eu_sales'].plot.hist(figsize=(10, 3))
plt.title('Диаграмма распределения игр по продажам в Европе')
plt.xlabel('Продажи, млн копий')
plt.ylabel('Количество игр')
plt.show()

Таблица распределения частот.

In [151]:
pd.DataFrame(
    data.loc[data['eu_sales'] > 0, 'eu_sales'].value_counts().head(10).sort_index()
).T.rename(index={'eu_sales': 'количество игр'})
Out[151]:
0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.12
количество игр 1492 1306 921 708 560 410 355 308 269 233
  • В Европе было продано только 65 % всех игр — это 10 825 наименований.
  • Минимальное количество проданных в Европе копий одной игры — 10 тыс., максимальное — 28,96 млн.
  • Распределение объёмов продаж в Европе имеет экспоненциальный характер: количество игр, имеющих высокий объём продаж, уменьшается с ростом этого объёма.
  • В среднем, в Европе, игры продавались в объёме 70 тыс. копий каждая.
  • Большинство игр было продано в Европе в объёме не более 500 тыс. копий каждая. Игры, проданные в большем объёме, — явление редкое.
  • Половина всех игр продавалась в Европе в объёме 20–200 тыс. копий.
  • Наиболее часто игры продаются в Европе в объёме 10–120 тыс. копий.
  • Самое встречаемое значение в наборе данных — 10 тыс. копий. В таком объёме в Европе были проданы каждая из 1492 игр.
Продажи в Японии¶

Круговая диаграмма распределения компьютерных игр по продажам в Японии.

In [152]:
(data['jp_sales'] > 0).value_counts().rename(
    index={0: 'Продаж не было', 1: 'Продажи были'}
    ).plot.pie(
    title='Круговая диаграмма\nраспределения игр\nпо продажам в Японии',
    label='',
    figsize=(10, 3))
plt.show()

Таблица относительных частот.

In [153]:
pd.DataFrame((data['jp_sales'] > 0).value_counts() /
             data.shape[0] * 100).round(0).astype('int').rename(
    index={0: 'Продаж не было', 1: 'Продажи были'},
    columns={'jp_sales': 'Относительная частота, %'}).T
Out[153]:
Продаж не было Продажи были
Относительная частота, % 63 37

Описательная статистика.

In [154]:
descriptive_statistics(data.loc[data['jp_sales'] > 0, 'jp_sales'],
                       'Продажи в Японии, млн копий')
Out[154]:
Продажи в Японии, млн копий
кол-во значений 6184
кол-во уникальных 243
мин. 0.01
-1.5IQR -0.17
25 % 0.03
мода [0.02]
медиана 0.07
среднее ариф. 0.21
75 % 0.19
+1.5IQR 0.31
макс. 10.22
размах 10.21
межквартильный размах 0.16

Диаграмма размаха.

In [155]:
data.loc[data['jp_sales'] > 0, 'jp_sales'].plot.box(
    title='Диаграмма размаха\nраспределения игр\nпо продажам в Японии',
    label='Название игры',
    ylabel='Продажи, млн копий',
    ylim=(0, 1),
    figsize=(3, 3))
plt.show()

Диаграмма распределения частот.

In [156]:
data.loc[(data['jp_sales'] > 0) & (data['jp_sales'] < 1), 'jp_sales'].plot.hist(figsize=(10, 3))
plt.title('Диаграмма распределения игр по продажам в Японии')
plt.xlabel('Продажи, млн копий')
plt.ylabel('Количество игр')
plt.show()

Таблица распределения частот.

In [157]:
pd.DataFrame(
    data.loc[data['jp_sales'] > 0, 'jp_sales'].value_counts().head(10).sort_index()
).T.rename(index={'jp_sales': 'количество игр'})
Out[157]:
0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.10
количество игр 705 739 543 395 321 296 227 220 156 154
  • В Японии было продано только 37 % всех игр — это 6184 наименований.
  • Минимальное количество проданных в Японии копий одной игры — 10 тыс., максимальное — 10,22 млн.
  • Распределение объёмов продаж в Японии имеет экспоненциальный характер: количество игр, имеющих высокий объём продаж, уменьшается с ростом этого объёма.
  • В среднем, в Японии, игры продавались в объёме 70 тыс. копий каждая.
  • Большинство игр было продано в Японии в объёме не более 450 тыс. копий каждая. Игры, проданные в большем объёме, — явление редкое.
  • Половина всех игр продавалась в Японии в объёме 30–190 тыс. копий.
  • Наиболее часто игры продаются в Японии в объёме 10–100 тыс. копий.
  • Самое встречаемое значение в наборе данных — 20 тыс. копий. В таком объёме в Японии были проданы каждая из 739 игр.
Продажи в других регионах¶

Круговая диаграмма распределения компьютерных игр по продажам в остальных регионах.

In [158]:
(data['other_sales'] > 0).value_counts().rename(
    index={0: 'Продаж не было', 1: 'Продажи были'}
    ).plot.pie(
    title='Круговая диаграмма\nраспределения игр\nпо продажам в других регионах',
    label='',
    figsize=(10, 3))
plt.show()

Таблица относительных частот.

In [159]:
pd.DataFrame((data['other_sales'] > 0).value_counts() /
             data.shape[0] * 100).round(0).astype('int').rename(
    index={0: 'Продаж не было', 1: 'Продажи были'},
    columns={'other_sales': 'Относительная частота, %'}).T
Out[159]:
Продажи были Продаж не было
Относительная частота, % 61 39

Описательная статистика.

In [160]:
descriptive_statistics(data.loc[data['other_sales'] > 0, 'other_sales'],
                       'Продажи в остальных регионах, млн копий')
Out[160]:
Продажи в остальных регионах, млн копий
кол-во значений 10092
кол-во уникальных 154
мин. 0.01
-1.5IQR -0.07
25 % 0.01
мода [0.01]
медиана 0.02
среднее ариф. 0.08
75 % 0.07
+1.5IQR 0.11
макс. 10.57
размах 10.56
межквартильный размах 0.06

Диаграмма размаха.

In [161]:
data.loc[data['other_sales'] > 0, 'other_sales'].plot.box(
    title='Диаграмма размаха\nраспределения игр\nпо продажам в других регионах',
    label='Название игры',
    ylabel='Продажи, млн копий',
    ylim=(0, 1),
    figsize=(3, 3))
plt.show()

Диаграмма распределения частот.

In [162]:
data.loc[(data['other_sales'] > 0) & (data['other_sales'] < 1), 'other_sales'].plot.hist(figsize=(10, 3))
plt.title('Диаграмма распределения игр по продажам в других регионах')
plt.xlabel('Продажи, млн копий')
plt.ylabel('КОличество игр')
plt.show()

Таблица распределения частот.

In [163]:
pd.DataFrame(
    data.loc[data['other_sales'] > 0, 'other_sales'].value_counts().head(10).sort_index()
).T.rename(index={'other_sales': 'количество игр'})
Out[163]:
0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.10
количество игр 3457 1606 927 652 475 393 338 237 185 174
  • В других регионах было продано только 61 % всех игр — это 10 092 наименований.
  • Минимальное количество проданных в других регионах копий одной игры — 10 тыс., максимальное — 10,57 млн.
  • Распределение объёмов продаж в других регионах имеет экспоненциальный характер: количество игр, имеющих высокий объём продаж, уменьшается с ростом этого объёма.
  • В среднем, в других регионах, игры продавались в объёме 20 тыс. копий каждая.
  • Большинство игр было продано в других регионах в объёме не более 180 тыс. копий каждая. Игры, проданные в большем объёме, — явление редкое.
  • Половина всех игр продавалась в других регионах в объёме 10–70 тыс. копий.
  • Наиболее часто игры продаются в других регионах в объёме 10–100 тыс. копий.
  • Самое встречаемое значение в наборе данных — 10 тыс. копий. В таком объёме в других регионах были проданы каждая из 3457 игр.

Корреляционный анализ данных¶

Игровые платформы¶

Диаграмма распределения поколений игровых систем по годам выпуска компьютерных игр.

In [164]:
data.plot.scatter(
    x='year_of_release',
    y='generation',
    xlabel='Год выпуска игры',
    ylabel='Поколение игровой системы',
    title='Диаграмма рассеяния\n"Поколение игровой системы $-$ год выпуска игры"',
    figsize=(6, 3)
)
plt.show()
  • Цикл жизни одного поколения игровых систем составляет примерно 10–15 лет.
  • Появление игровых систем нового поколения приходится на середину жизненного цикла предыдущего поколения и практически всегда совпадает с уходом с рынка предпредыдущего поколения.
  • Таким образом, с большой долей вероятности можно утверждать, что игровые системы двух, идущих подряд поколений полностью вытесняют с рынка все предыдущие поколения игровых систем, поскольку игры для последних перестают выпускаться разработчиками.

Диаграмма распределения производителей игровых платформ по годам выпуска компьютерных игр.

In [165]:
data.sort_values(by='producer', ascending=False).plot.scatter(
    x='year_of_release',
    y='producer',
    figsize=(6, 3),
    xlabel='Год выпуска игры',
    ylabel='Производитель платформы',
    title='Диаграмма рассеяния\n"Производитель платформы $-$ год выпуска игры"'
)
plt.show()
  • Игры для платформы Atari — родом из 1980-х гг. Там же они и остались, вместе с платформой.
  • Когда-то популярная Sega осталась в 2000-х гг. Последние игры для неё выходили в 2008 году.
  • Малоизвестные Bandai, NEC, SNK, Panasonic & Co. вроде появлялись на рынке игровых платформ, но быстро исчезли.
  • Остались только самые стойкие:
    • Nintendo, которая выпускает платформы на протяжении, по крайней мере, 34 года;
    • Sony, которая выпускает платформы на протяжении 22 лет;
    • к ним присоединившаяся в 2001-м году Microsoft;
    • и персональный компьютер, игры для которого выпускаются не менее 32 лет.
  • На рынке можно найти игры только для 3 производителей игровых приставок, а также для персонального компьютера.

Диаграмма распределения игровых платформ по годам выпуска компьютерных игр.

In [166]:
data.plot.scatter(
    x='year_of_release',
    y='platform',
    xlabel='Год выпуска игры',
    ylabel='Игровая платформа',
    title='Диаграмма рассеяния\n"Игровая платформа $-$ год выпуска игры"',
    figsize=(6, 6)
)
plt.show()
  • Появление новых игровых платформ на рынке происходит не линейно, а волнообразно.
  • Цикл жизни у разных платформ разный: есть платформы с длительным жизненным циклом — игры для них выпускаются порядка 10 лет, есть с коротким — 5 лет и меньше.
  • На фоне остальных выделяется выступающий в качестве игровой платформы персональный компьютер: его жизненный цикл самый длинный.
  • На момент 2016 года игры выпускаются только для 9 платформ: для 8 игровых приставок (Sony PlayStation 3 и PlayStation 4, PlayStation Vita, Nintendo Wii и WiiU, Nintendo 3DS, Microsoft Xbox 360 и Xbox One) и для персонального компьютера.
  • Примечательно, что игры для платформы Sony PlayStation Portable последний раз выходили в 2015 году. Видимо, платформа всё-таки ушла с рынка.

Топ-10 платформ с наибольшими суммарными продажами и время их актуальности на рынке компьютерных игр.

In [167]:
lifetime = data.groupby(['producer', 'platform'])['year_of_release'].agg(['min', 'max']).join(
data.groupby(['producer', 'platform'])['total_sales'].agg(['count', 'sum']))
lifetime['range'] = lifetime['max'] - lifetime['min'] + 1
lifetime = lifetime.reset_index().rename(columns={
    'producer': 'Производитель платформы',
    'platform': 'Платформа',
    'min': 'Год выпуска первой игры',
    'max': 'Год выпуска последней игры',
    'count': 'Количество игр',
    'sum': 'Объём продаж в мире, млн копий',
    'range': 'Время актуальности платформы, лет'})
lifetime.sort_values(by='Объём продаж в мире, млн копий',
                     ascending=False).head(10).reset_index(drop=True)
Out[167]:
Производитель платформы Платформа Год выпуска первой игры Год выпуска последней игры Количество игр Объём продаж в мире, млн копий Время актуальности платформы, лет
0 sony ps2 2000 2011 2128 1249.95 12
1 microsoft x360 2005 2016 1256 971.41 12
2 sony ps3 2006 2016 1327 939.65 11
3 nintendo wii 2006 2016 1312 907.51 11
4 nintendo ds 2004 2013 2115 805.82 10
5 sony ps 1994 2003 1196 730.86 10
6 nintendo gba 2000 2007 817 316.17 8
7 sony ps4 2013 2016 392 314.14 4
8 sony psp 2004 2015 1192 294.05 12
9 pc pc 1985 2016 974 259.52 32
  • Самой популярной платформой была Sony PlayStation 2: объём проданных для неё игр почти доходит до отметки 1,25 млрд копий. Да и количество выпущенных для неё игр тоже самое большое — 2128 наименований. Платформа просуществовала на рынке компьютерных игр в течение 12 лет и ушла с него в 2011 году.
  • Второй по популярности является платформа Microsoft Xbox 360: количество проданных для неё игр приближается к 1 млрд — (971 млн копий). Количество выпущенных игр для неё тоже внушительное — 1256 наименований. Платформа находится на рынке уже 12 лет, с 2005 года.
  • Замыкает тройку лидеров Sony PlayStation 3: объём проданных копий игр для неё почти достиг 940 млн. Количество выпущенных игр тоже внушительное — 1327 наименований. Платформа на рынке 11 лет, с 2006 года.
  • Следом идут Nintendo Wii (c объёмом проданных копий игр более 900 млн), Nintendo DS (с объёмом проданных копий игр более 800 млн). Последняя просуществовала на рынке 10 лет и ушла с него в 2013 году. Nintendo Wii существует на рынке уже 11 лет, с 2006 года.
  • Таким образом, подтверждается ранее сделанная оценка жизненного цикла игровой приставки: игры для одной игровой приставки выпускают на протяжении 10–12 лет.

Выделение в данных актуального периода¶

Для построения прогноза необходимо исследовать данные за актуальный период.

Из всех производителей игровых платформ только четыре продолжают оставаться на рынке. Кроме того, нужно учитывать, что жизненный цикл одной платформы на рынке составляет 10–12 лет, после окончания которого платформа обычно уходит с рынка.

Проследим, как менялся объём продаж игр для платформ тех производителей, которые ещё остаются на рынке. Выберем среди их платформ потенциально прибыльные.

Платформы производства Sony¶

Динамика количества выпускаемых игр для платформ производства Sony.

In [168]:
plt.figure(figsize=(12, 4))

for platform_name in data.loc[data['producer'] == 'sony', 'platform'] \
                         .sort_values().unique():
    plt.plot(data[data['platform'] == platform_name] \
             .groupby('year_of_release')['year_of_release'].agg('count'))

plt.legend(data.loc[data['producer'] == 'sony', 'platform'].sort_values().unique())
plt.title('Графики зависимости' +
          '\nколичества выпущенных игр для платформ Sony' +
          '\nот года выпуска')
plt.xlabel('Год выпуска')
plt.ylabel('Количество игр')
plt.show()

Динамика объемов продаж игр для платформ производства Sony.

In [169]:
plt.figure(figsize=(12, 4))
for platform_name in data.loc[data['producer'] == 'sony', 'platform'] \
                         .sort_values().unique():
    plt.plot(data[data['platform'] == platform_name] \
             .groupby('year_of_release')['total_sales'].agg('sum'))

plt.legend(data.loc[data['producer'] == 'sony', 'platform'].sort_values().unique())
plt.title('Графики зависимости' +
          '\nмировых продаж игр для платформ Sony' +
          '\nот года выпуска')
plt.xlabel('Год выпуска')
plt.ylabel('Продажи, млн копий')
plt.show()
  • Sony выпускает на рынок новую платформу, когда продажи игр для предыдущей находятся в максимуме или уже начинают падать.
  • Причём ситуация здесь двоякая: новую платформу выпускают, чтобы поднять падающие продажи предыдущей платформы, либо выход новой платформы вызывает это падение.
  • К 2016 году продажи PlayStation 3 достигают своего минимума. У объёма продаж игр для этой платформы был максимум в 2011 году, после которого происходит спад продаж. Платформа уже прошла свой жизненный цикл и в 2017 году будет не актуальна.
  • На смену PlayStation 3 пришла PlayStation 4. Продажи игр для неё находятся в подъёме. Резкое снижение на графике продаж в 2016 году не должно смущать, поскольку данные за последний год могут быть неполными. Кроме того, эта платформа существует на рынке только 4-й год, и её жизненный цикл ещё не завершится в течение нескольких ближайших лет.
  • PlayStation Vita пришла на смену PlayStation Portable, продажи игр для которой достигли своего минимума в 2015 году, и которая завершила свой жизненный цикл на рынке. Продажи игр для PlayStation Vita, в принципе, не являются высокими и держатся приблизительно на одном уровне. Кроме того, количество новых игр, выпускаемых для неё, растёт. Поэтому можно ожидать роста их продаж в будущем.
  • Очевидно, что для построения прогноза нужно использовать данные о продажах игр для платформ PlayStation 4 и PlayStation Vita.

Платформы производства Nintendo¶

Динамика количества выпускаемых игр для платформ производства Nintendo.

In [170]:
plt.figure(figsize=(12, 4))

for platform_name in data.loc[data['producer'] == 'nintendo', 'platform'] \
                         .sort_values().unique():
    plt.plot(data[data['platform'] == platform_name] \
             .groupby('year_of_release')['year_of_release'].agg('count'))

plt.legend(data.loc[data['producer'] == 'nintendo', 'platform'].sort_values().unique())
plt.title('Графики зависимости' +
          '\nколичества выпущенных игр для платформ Nintendo' +
          '\nот года выпуска')
plt.xlabel('Год выпуска')
plt.ylabel('Количество игр')
plt.show()

Динамика объемов продаж игр для платформ производства Nintendo.

In [171]:
plt.figure(figsize=(12, 4))

for platform_name in data.loc[data['producer'] == 'nintendo', 'platform'] \
                         .sort_values().unique():
    plt.plot(data[data['platform'] == platform_name] \
             .groupby('year_of_release')['total_sales'].agg('sum'))

plt.legend(data.loc[data['producer'] == 'nintendo', 'platform'].sort_values().unique())
plt.title('Графики зависимости' +
          '\nмировых продаж игр для платформ Nintendo' +
          '\nот года выпуска')
plt.xlabel('Год выпуска')
plt.ylabel('Продажи, млн копий')
plt.show()
  • Nintendo, как и Sony, выпускает на рынок новую платформу, когда продажи игр для предыдущей находятся в максимуме или уже начинают падать.
  • И здесь ситуация не однозначная: выпуск новой платформы является либо следствием падения продаж игр для предыдущей платформы, либо сам вызывает это падение.
  • В 2016 году игры для платформы Wii хоть ещё и продаются, но продажи для неё уже прошли пик максимума в 2009 году, после которого произошло резкое падение продаж. И уже на протяжении нескольких лет продажи игр для этой платформы находятся в минимуме. Видимо, поддерживаются небольшим количеством новых игр, выпускаемых в последние годы. Платформа уже прошла свой жизненный цикл на рынке и в 2017 году вряд ли будет актуальна.
  • Платформа WiiU, которая пришла на смену Wii, не достигла таких же объёмов продаж выпущенных для неё игр, как Wii, но к 2016 году продажи остаются примерно на таком же уровне, как и в предыдущие годы. Падение на графике продаж в период с 2015 по 2016 годы также не должно смущать, поскольку данные за 2016 год неполные.
  • Платформа 3DS пришла на смену DS. И хотя объём продаж игр для неё снижается в течение последних двух лет, однако это снижение не сильное (по сравнению с DS). И ожидается, что в 2017 году эта платформа останется актуальной. Кроме того, количество выпускаемых для неё новых игр не снижается.
  • Очевидно, что для построения прогноза нужно использовать данные о продажах игр для платформ WiiU и 3DS.

Платформы производства Microsoft¶

Динамика количества выпускаемых игр для платформ производства Microsoft.

In [172]:
plt.figure(figsize=(12, 4))

for platform_name in data.loc[data['producer'] == 'microsoft', 'platform'] \
                         .sort_values().unique():
    plt.plot(data[data['platform'] == platform_name] \
             .groupby('year_of_release')['year_of_release'].agg('count'))

plt.legend(data.loc[data['producer'] == 'microsoft', 'platform'].sort_values().unique())
plt.title('Графики зависимости' +
          '\nколичества выпущенных игр для платформ Microsoft' +
          '\nот года выпуска')
plt.xlabel('Год выпуска')
plt.ylabel('Количество игр')
plt.show()

Динамика объемов продаж игр для платформ производства Microsoft.

In [173]:
plt.figure(figsize=(12, 4))

for platform_name in data.loc[data['producer'] == 'microsoft', 'platform'] \
                         .sort_values().unique():
    plt.plot(data[data['platform'] == platform_name] \
             .groupby('year_of_release')['total_sales'].agg('sum'))

plt.legend(data.loc[data['producer'] == 'microsoft', 'platform'].sort_values().unique())
plt.title('Графики зависимости' +
          '\nмировых продаж игр для платформ Microsoft' +
          '\nот года выпуска')
plt.xlabel('Год выпуска')
plt.ylabel('Продажи, млн копий')
plt.show()
  • Microsoft выпускает на рынок новую платформу, когда продажи игр для предыдущей уже падают. Вероятно, пытаются таким образом удержать уровень объёма продаж.
  • Платформа Xbox 360 в 2016 году ещё находится на рынке. Но объёмы продаж игр для неё достигли максимума в 2010 году, после которого непрерывно снижались и в 2016 находятся в своём минимуме. Платформа уже прошла свой жизненный цикл на рынке. Её присутствие поддерживается небольшим количеством выпускаемых новых игр. Но в 2017 году она будет неактуальна.
  • На смену Xbox 360 пришла платформа Xbox One. Объём продаж игр для неё растёт. Падение на графике продаж в период с 2015 по 2016 год также не должно смущать, поскольку данные за 2016 год неполные. Кроме того, количество производимых новых игр для неё неуклонно растёт.
  • Очевидно, что для построения прогноза нужно использовать данные о продажах игр для платформы Xbox One.

Персональный компьютер как игровая платформа¶

Динамика количества выпускаемых игр для персонального компьютера.

In [174]:
plt.figure(figsize=(12, 4))
plt.plot(data[data['platform'] == 'pc'] \
         .groupby('year_of_release')['year_of_release'].agg('count'))
plt.title('Графики зависимости' +
          '\nколичества выпущенных игр для персонального компьютера' +
          '\nот года выпуска')
plt.xlabel('Год выпуска')
plt.ylabel('Количество игр')
plt.show()

Динамика объемов продаж игр для персонального компьютера.

In [175]:
plt.figure(figsize=(12, 4))
plt.plot(data[data['platform'] == 'pc'] \
         .groupby('year_of_release')['total_sales'].agg('sum'))
plt.title('Графики зависимости' +
          '\nмировых продаж игр для персонального компьютера' +
          '\nот года выпуска')
plt.xlabel('Год выпуска')
plt.ylabel('Продажи, млн копий')
plt.show()
  • Продажи игр для персонального компьютера достигли своего максимума в 2011 году. Но тогда и игр выходило рекордное количество. И, в целом, на рынке компьютерных игр и игровых приставок происходил бум, за которым последовал спад рынка.
  • В общем, объём продаж игр для персональных компьютеров хоть и не достигает таких же головокружительных значений, как объём проданных игр для консолей, но остаётся стабильным на протяжении длительного времени.
  • Наличие в предложении интернет-магазина игр для персональных компьютеров обеспечит минимальным, но стабильным (ненулевым) доходом.
  • Кроме того, надежду на рост объёмов продаж даёт рост количества новых выпускаемых игр для персонального компьютера.
  • Очевидно, что для построения прогноза нужно использовать данные о продажах игр для персонального компьютера тоже.

Анализ данных за актуальный период¶

Наибольший интерес представляют 6 платформ: 5 игровых приставок, а также персональный компьютер. Все они являются игровыми системами последнего, восьмого поколения. Это приставки

  • производства Sony: домашняя игровая приставка PlayStation 4 и портативная игровая приставка PlayStation Vita;
  • производства Nintendo: домашняя игровая приставка WiiU и портативная игровая приставка 3DS;
  • производства Microsoft: домашняя игровая приставка Xbox One;
  • а также персональный компьютер.

Все эти платформы начали появляться после 2011 года. Выделим записи об играх для этого временного периода из общего набора данных и последующий анализ будем проводить для них.

In [176]:
actual_data = data[data['year_of_release'] >= 2012]
actual_data.sample(5)
Out[176]:
name platform year_of_release genre na_sales eu_sales jp_sales other_sales critic_score user_score rating total_sales age generation producer
14523 tiger woods pga tour 14 ps3 2013 sports 0.16 0.14 0.00 0.07 74.0 3.8 e 0.37 0 7 sony
15834 shovel knight 3ds 2015 platform 0.08 0.04 0.02 0.01 90.0 8.2 e 0.15 0 8 nintendo
16194 trackmania turbo ps4 2016 action 0.03 0.26 0.00 0.05 81.0 7.9 e 0.34 0 8 sony
15764 metal gear solid v: the phantom pain ps3 2015 action 0.22 0.13 0.22 0.07 -1.0 7.2 m 0.64 17 7 sony
14842 shirahana no ori: hiiro no kakera 4 - shiki no... psp 2013 adventure 0.00 0.00 0.01 0.00 -1.0 -1.0 nd 0.01 -1 7 sony

Распределение продаж игр по платформам¶

Диаграммы размаха значений годовых объёмов продаж по миру для каждой платформы.

In [177]:
pivot = actual_data.pivot_table(index='year_of_release',
                                columns='platform',
                                values='total_sales',
                                aggfunc='sum')
pivot.reset_index(drop=True, inplace=True)
pivot.plot.box()
plt.title('Диаграмма размаха\nраспределения годовых продаж игр по платформам')
plt.xlabel('Платформа')
plt.ylabel('Годовой объём продаж, млн копий')
plt.show()
  • Годовые объёмы продаж наибольшие у игр для платформы Sony PlayStation 4: в среднем они достигают значений 85 млн копий в год. Но разброс значений большой — от 20 до 120 млн копий в год. Разброс годовых продаж для PlayStation 3 ещё шире, но в среднем он меньше, чем у PlayStation 4.
  • Годовой объём продаж игр для портативной игровой приставки Sony PlayStation Vita гораздо меньше: составляет в среднем менее 10 млн копий в год.
  • Среди приставок Nintendo большим спросом пользуются, наоборот, игры для портативной Nintendo 3DS: годовые продажи в среднем могут достигать 50 млн копий.
  • А вот игры для домашней приставки Nintendo WiiU пользуются гораздо меньшим спросом, но зато стабильным — на уровне 20 млн копий в год. Годовые продажи для Nintendo Wii ещё менььше.
  • Игры для приставки Microsoft Xbox One продаются почти также как Nintendo 3DS, но в среднем немного меньше — около 40 млн копий в год. Средний годовой объём продаж и размах значений у Microsoft Xbox 360 выше, но продажи игр для этой платформы уже упали и не достигнут таких значений в будущем.
  • Таким образом, среди игр для домашних игровых консолей наименьший спрос получили игры для Nintendo WiiU (20 млн копий в год), в два раза больший — для Microsoft Xbox One (40 млн копий в год), и ещё в два раза больший — для Sony PlayStation 4 (80 млн копий в год).
  • Среди игр для портативных игровых приставок меньшим спросом пользуются игры для PlayStition Vita (10 млн копий в год), а для Nintendo 3DS — в 4 раза более высоким (40 млн копий в год).
  • Особняком стоит персональный компьютер: игры для него пользуются невысоким, но стабильным спросом — 15 млн копий в год.
  • У платформы Sony PlayStation Portable низкий годовой объём продаж, и она уже ушла с рынка.

Диаграммы размаха значений объёма мировых продаж игр для каждой платформы.

In [178]:
pivot = actual_data.pivot_table(index='name',
                                columns='platform',
                                values='total_sales')
pivot.reset_index(drop=True, inplace=True)
pivot.plot.box()
plt.title('Диаграмма размаха' +
          '\nраспределения игр по объёму мировых продаж' +
          '\nдля каждой платформы')
plt.xlabel('Платформа')
plt.ylabel('Объём продаж одной игры, млн копий')
plt.show()
In [179]:
pivot = actual_data.pivot_table(index='name',
                                columns='platform',
                                values='total_sales')
pivot.reset_index(drop=True, inplace=True)
pivot.plot.box()
plt.ylim(0, 2)
plt.title('Диаграмма размаха' +
          '\nраспределения игр по объёму мировых продаж' +
          '\nдля каждой платформы')
plt.xlabel('Платформа')
plt.ylabel('Объём продаж одной игры, млн копий')
plt.yticks([0.2*n for n in range(10)])
plt.show()
  • Игры для домашних приставок в среднем пользуются большим спросом, чем игры для портативных приставок или для персонального компьютера.
  • Одна игра для домашних приставок продаётся в среднем 200 тысяч раз. Половина всех игр для одной платформы продаётся в объёме 50–700 тыс. копий среди игр для игровых приставок Sony PlayStation 3 и 4, а также Microsoft Xbox 360 и Xbox One, и в объёме 100–500 тыс. копий среди игр для Nintendo WiiU. Несколько меньше продаётся копий одной игры для Nintendo Wii.
  • В целом, продажи игр могут достигать значений 1,2 млн копий — для игр платформы Nintendo WiiU, 1,6 млн копий — для игр платформы Microsoft Xbox One, и даже 1,8 млн копий для игр платформы Sony PlayStation 4. Продажи игр для платформы Nintendo Wii могли достигать значений 800 тыс. копий, для платформы PlayStation 3 могли достигать значений 1,5 млн копий — это меньше, чем для платформ, пришедших им на смену. Продажи игр для Microsoft Xbox 360 могли достигать значений 1,8 млн копий, что больше, чем для Xbox One. Однако последняя набирает рост в объёмах продаж и, возможно, максимальные значения для этой платформы ещё впереди.
  • Для портативных игровых приставок объём продаж одной игры меньше: для PlayStation Vita — 50 тыс. копий, для Nintendo 3DS — 100 тыс. копий. Ушедшая с рынка PlayStation Portable имела объём продаж одной игры, выпущенной для неё, на уровне с PlayStation Vita. Объём продаж одной игры для Nintendo DS был ниже, чем для Nintendo 3DS.
  • Объём продаж игр для портативных приставок может достигать объёма 300 тыс. копий — для игр Sony PlayStation Vita, 700 тыс. копий — для игр Nintendo 3DS. Максимальные объёмы продаж для игр Sony PlayStation Portable и Nintendo DS были на уровне 250 и 400 тыс. копий, соответственно.
  • Игры для персонального компьютера продаются в среднем на таком же уровне, как и для портативных игровых платформ — 100 тыс. копий. Но могут достигать отметки в 550 тыс. копий.

Влияние оценок пользователей и критиков¶

Sony PlayStation 4¶

Оценка пользователей

Диаграмма рассеяния "Объём мировых продаж — оценка пользователей".

In [180]:
actual_data[(actual_data['platform'] == 'ps4') &
            (actual_data['user_score'] > 0)].plot.scatter(
    x='user_score',
    y='total_sales',
    xlabel='Оценка пользователей',
    ylabel='Объём мировых продаж, млн копий',
    title='Диаграмма рассеяния\n"Объём мировых продаж $-$ оценка пользователей"',
    alpha=0.2,
    figsize=(6, 4))
plt.show()

Коэффициент корреляции.

In [181]:
actual_data.loc[(actual_data['platform'] == 'ps4') &
                (actual_data['user_score'] > 0), 'user_score'].corr(
    actual_data.loc[(actual_data['platform'] == 'ps4') &
                    (actual_data['user_score'] > 0), 'total_sales']).round(2)
Out[181]:
-0.03
  • Объём мировых продаж не коррелирует с оценкой пользователей.
  • Много игр с высоким объёмом продаж имеют пользовательскую оценку среднюю или ниже средней.

Оценка критиков

Диаграмма рассеяния "Объём мировых продаж — оценка критиков".

In [182]:
actual_data[(actual_data['platform'] == 'ps4') &
            (actual_data['critic_score'] > 0)].plot.scatter(
    x='critic_score',
    y='total_sales',
    xlabel='Оценка критиков',
    ylabel='Объём мировых продаж, млн копий',
    title='Диаграмма рассеяния\n"Объём мировых продаж $-$ оценка критиков"',
    alpha=0.2,
    figsize=(6, 4))
plt.show()

Коэффициент корреляции.

In [183]:
actual_data.loc[(actual_data['platform'] == 'ps4') &
                (actual_data['critic_score'] > 0), 'critic_score'].corr(
    actual_data.loc[(actual_data['platform'] == 'ps4') &
                    (actual_data['critic_score'] > 0), 'total_sales']).round(2)
Out[183]:
0.41

График зависимости медианного значения объёма мировых продаж от оценки критиков.

In [184]:
actual_data[(actual_data['platform'] == 'ps4') &
            (actual_data['critic_score'] > 0)] \
.groupby('critic_score')['total_sales'].agg('median').plot(figsize=(6, 4))
plt.xlabel('Оценка критиков')
plt.ylabel('Объём продаж, млн копий')
plt.title('График зависимости' +
          '\nмедианного значения объёма мировых продаж' +
          '\nот оценки критиков')
plt.show()
  • Объём мировых продаж умеренно коррелирует с оценкой критиков.
  • Зависимость не является линейной, но носит возрастающий характер.
  • У игр, имеющих высокую оценку критиков, высокий объём мировых продаж. И, наоборот, игры, получившие среднюю оценку или ниже средней, характеризуются низким объёмом мировых продаж.
  • Для оценок критиков до 70 баллов наблюдается пологий рост объёмов продаж.
  • С дальнейшим ростом оценки критиков наблюдается более интенсивный рост объёмов продаж, достигающий в среднем 1 млн копий для игр с оценкой в 90 баллов.
  • Игры, получившие в качестве оценки критиков более 90 баллов, имеют в разы большие объёмы продаж.
  • Тенденция отчётливо наблюдается на графике медианных значений объёмов продаж в зависимости от оценки критиков.
Sony PlayStation Vita¶

Оценка пользователей

Диаграмма рассеяния "Объём мировых продаж — оценка пользователей".

In [185]:
actual_data[(actual_data['platform'] == 'psv') &
            (actual_data['user_score'] > 0)].plot.scatter(
    x='user_score',
    y='total_sales',
    xlabel='Оценка пользователей',
    ylabel='Объём мировых продаж, млн копий',
    title='Диаграмма рассеяния\n"Объём мировых продаж $-$ оценка пользователей"',
    alpha=0.2,
    figsize=(6, 4))
plt.show()

Коэффициент корреляции.

In [186]:
actual_data.loc[(actual_data['platform'] == 'psv') &
                (actual_data['user_score'] > 0), 'user_score'].corr(
    actual_data.loc[(actual_data['platform'] == 'psv') &
                    (actual_data['user_score'] > 0), 'total_sales']).round(2)
Out[186]:
-0.0
  • Объём мировых продаж не коррелирует с оценкой пользователей.
  • Много игр с высоким объёмом продаж имеют пользовательскую оценку среднюю или ниже средней.

Оценка критиков

Диаграмма рассеяния "Объём мировых продаж — оценка критиков".

In [187]:
actual_data[(actual_data['platform'] == 'psv') &
            (actual_data['critic_score'] > 0)].plot.scatter(
    x='critic_score',
    y='total_sales',
    xlabel='Оценка критиков',
    ylabel='Объём мировых продаж, млн копий',
    title='Диаграмма рассеяния\n"Объём мировых продаж $-$ оценка критиков"',
    alpha=0.2,
    figsize=(6, 4))
plt.show()

Коэффициент корреляции.

In [188]:
actual_data.loc[(actual_data['platform'] == 'psv') &
                (actual_data['critic_score'] > 0), 'critic_score'].corr(
    actual_data.loc[(actual_data['platform'] == 'psv') &
                    (actual_data['critic_score'] > 0), 'total_sales']).round(2)
Out[188]:
0.09

Кто оказался "белой вороной"?

In [189]:
actual_data[(actual_data['platform'] == 'psv') &
            (actual_data['critic_score'] > 0) &
            (actual_data['critic_score'] < 40)]
Out[189]:
name platform year_of_release genre na_sales eu_sales jp_sales other_sales critic_score user_score rating total_sales age generation producer
13728 call of duty black ops: declassified psv 2012 action 0.71 0.43 0.07 0.26 33.0 4.8 m 1.47 17 8 sony
  • Коэффициент корреляции между объёмом продаж и оценкой критиков оказался низким.
  • Причина тому — выброс с низкой оценкой, но с одним из самых больших объёмов продаж.
  • Выбросом оказалось значение оценки игры "Call of duty black ops: declassified", которую охарактеризовали как "злая халтура", но по-видимому, выход которой пользователи ждали, и поэтому игра характеризуется высоким объёмом продаж.
  • Очевидно, что анализ корреляционной связи нужно проводить без учёта этого значения.

Коэффициент корреляции (без учёта выброса).

In [190]:
actual_data.loc[(actual_data['platform'] == 'psv') &
                (actual_data['critic_score'] > 0) &
                (actual_data['critic_score'] > 40), 'critic_score'].corr(
    actual_data.loc[(actual_data['platform'] == 'psv') &
                    (actual_data['critic_score'] > 0) &
                    (actual_data['critic_score'] > 40), 'total_sales']).round(2)
Out[190]:
0.3

График зависимости медианного значения объёма мировых продаж от оценки критиков (без учёта выброса).

In [191]:
actual_data[(actual_data['platform'] == 'psv') &
            (actual_data['critic_score'] > 0) &
            (actual_data['critic_score'] > 40)] \
    .groupby('critic_score')['total_sales'].agg('median').plot(figsize=(6, 4))
plt.xlabel('Оценка критиков')
plt.ylabel('Объём продаж, млн копий')
plt.title('График зависимости' +
          '\nмедианного значения объёма мировых продаж' +
          '\nот оценки критиков')
plt.show()
  • Объём мировых продаж слабо коррелирует с оценкой критиков.
  • Значения имеют большой разброс на диаграмме рассеяния.
  • Большое количество игр, имеющих высокий объём продаж, не получили высокую оценку критиков.
  • Однако на графике медианных значений объёмов продаж хоть и слабо он заметен, но всё же можно наблюдать рост объёмов продаж с ростом оценки критиков. И также наблюдается "излом" в области 70 баллов.
Nintendo WiiU¶

Оценка пользователей

Диаграмма рассеяния "Объём мировых продаж — оценка пользователей".

In [192]:
actual_data[(actual_data['platform'] == 'wiiu') &
            (actual_data['user_score'] > 0)].plot.scatter(
    x='user_score',
    y='total_sales',
    xlabel='Оценка пользователей',
    ylabel='Объём мировых продаж, млн копий',
    title='Диаграмма рассеяния\n"Объём мировых продаж $-$ оценка пользователей"',
    alpha=0.2,
    figsize=(6, 4))
plt.show()

Коэффициент корреляции.

In [193]:
actual_data.loc[(actual_data['platform'] == 'wiiu') &
                (actual_data['user_score'] > 0), 'user_score'].corr(
    actual_data.loc[(actual_data['platform'] == 'wiiu') &
                    (actual_data['user_score'] > 0), 'total_sales']).round(2)
Out[193]:
0.4

График зависимости медианного значения объёма мировых продаж от оценки пользователей.

In [194]:
actual_data[(actual_data['platform'] == 'wiiu') &
            (actual_data['user_score'] > 0)] \
    .groupby('user_score')['total_sales'].agg('median').plot(figsize=(6, 4))
plt.xlabel('Оценка пользователей')
plt.ylabel('Объём продаж, млн копий')
plt.title('График зависимости' +
          '\nмедианного значения объёма мировых продаж' +
          '\nот оценки пользователей')
plt.show()
  • Объём мировых продаж умеренно коррелирует с оценкой пользователей.
  • Зависимость не является линейной, но носит возрастающий характер.
  • У игр, имеющих высокую оценку пользователей, высокий объём мировых продаж. И, наоборот, игры, получившие среднюю оценку или ниже средней, характеризуются низким объёмом мировых продаж.
  • Для оценок пользователей до 7 баллов наблюдается пологий рост. С дальнейшим ростом пользовательской оценки наблюдается более интенсивный рост объёмов продаж, достигающий в среднем 1 млн копий. Эта тенденция особенно видна на графике медианных значений объёмов продаж в зависимости от оценки пользователей.

Оценка критиков

Диаграмма рассеяния "Объём мировых продаж — оценка критиков".

In [195]:
actual_data[(actual_data['platform'] == 'wiiu') &
            (actual_data['critic_score'] > 0)].plot.scatter(
    x='critic_score',
    y='total_sales',
    xlabel='Оценка критиков',
    ylabel='Объём мировых продаж, млн копий',
    title='Диаграмма рассеяния\n"Объём мировых продаж $-$ оценка критиков"',
    alpha=0.2,
    figsize=(6, 4))
plt.show()

Коэффициент корреляции.

In [196]:
actual_data.loc[(actual_data['platform'] == 'wiiu') &
                (actual_data['critic_score'] > 0), 'critic_score'].corr(
    actual_data.loc[(actual_data['platform'] == 'wiiu') &
                    (actual_data['critic_score'] > 0), 'total_sales']).round(2)
Out[196]:
0.35

График зависимости медианного значения объёма мировых продаж от оценки критиков.

In [197]:
actual_data[(actual_data['platform'] == 'wiiu') &
            (actual_data['critic_score'] > 0)] \
    .groupby('critic_score')['total_sales'].agg('median').plot(figsize=(6, 4))
plt.xlabel('Оценка критиков')
plt.ylabel('Объём продаж, млн копий')
plt.title('График зависимости' +
          '\nмедианного значения объёма мировых продаж' +
          '\nот оценки критиков')
plt.show()
  • Объём мировых продаж умеренно коррелирует с оценкой критиков.
  • Зависимость не является линейной, но носит возрастающий характер.
  • У игр, имеющих высокую оценку критиков, высокий объём мировых продаж. И, наоборот, игры, получившие среднюю оценку или ниже средней, характеризуются низким объёмом мировых продаж.
  • Есть игры, которые характеризуются высоким объёмом продаж, но которые не получили высокую оценку критиков. Это добавляет шума на графике зависимости медианных значений объёмов продаж от оценки критиков.
  • Для оценок критиков до 70 баллов наблюдается пологий рост объёма продаж.
  • С дальнейшим ростом оценки критиков наблюдается более интенсивный рост объёмов продаж, достигающий в среднем 1 млн копий для игр с оценкой в 90 баллов.
Nintendo 3DS¶

Оценка пользователей

Диаграмма рассеяния "Объём мировых продаж — оценка пользователей".

In [198]:
actual_data[(actual_data['platform'] == '3ds') &
            (actual_data['user_score'] > 0)].plot.scatter(
    x='user_score',
    y='total_sales',
    xlabel='Оценка пользователей',
    ylabel='Объём продаж, млн копий',
    title='Диаграмма рассеяния\n"Объём мировых продаж $-$ оценка пользователей"',
    alpha=0.2,
    figsize=(6, 4))
plt.show()

Коэффициент корреляции.

In [199]:
actual_data.loc[(actual_data['platform'] == '3ds') &
                (actual_data['user_score'] > 0), 'user_score'].corr(
    actual_data.loc[(actual_data['platform'] == '3ds') &
                    (actual_data['user_score'] > 0), 'total_sales']).round(2)
Out[199]:
0.2
  • Объём мировых продаж не коррелирует с оценкой пользователей.
  • Много игр с высоким объёмом продаж имеют пользовательскую оценку среднюю или ниже средней.

Оценка критиков

Диаграмма рассеяния "Объём мировых продаж — оценка критиков".

In [200]:
actual_data[(actual_data['platform'] == '3ds') &
            (actual_data['critic_score'] > 0)].plot.scatter(
    x='critic_score',
    y='total_sales',
    xlabel='Оценка критиков',
    ylabel='Объём продаж, млн копий',
    title='Диаграмма рассеяния\n"Объём мировых продаж $-$ оценка критиков"',
    alpha=0.2,
    figsize=(6, 4))
plt.show()

Коэффициент корреляции.

In [201]:
actual_data.loc[(actual_data['platform'] == '3ds') &
                (actual_data['critic_score'] > 0), 'critic_score'].corr(
    actual_data.loc[(actual_data['platform'] == '3ds') &
                    (actual_data['critic_score'] > 0), 'total_sales']).round(2)
Out[201]:
0.32

График зависимости медианного значения объёма мировых продаж от оценки критиков.

In [202]:
actual_data[(actual_data['platform'] == '3ds') &
            (actual_data['critic_score'] > 0)] \
    .groupby('critic_score')['total_sales'].agg('median').plot(figsize=(6, 4))
plt.xlabel('Оценка критиков')
plt.ylabel('Объём продаж, млн копий')
plt.title('График зависимости' +
          '\nмедианного значения объёма мировых продаж' +
          '\nот оценки критиков')
plt.show()
  • Объём мировых продаж умеренно коррелирует с оценкой критиков.
  • Зависимость не является линейной, но носит возрастающий характер.
  • У игр, имеющих высокую оценку критиков, высокий объём мировых продаж. И, наоборот, игры, получившие среднюю оценку или ниже средней, характеризуются низким объёмом мировых продаж.
  • Не все игры с высокой оценкой критиков имеют высокий уровень продаж.
  • Для оценок критиков до 80 баллов наблюдается пологий рост объёмов продаж в среднем до 800 тыс. копий.
  • С дальнейшим ростом оценки критиков наблюдается более интенсивный рост объёмов продаж, превышающий 1 млн копий для игр с оценкой выше 80 баллов.
  • Тенденция отчётливо наблюдается на графике медианных значений объёмов продаж в зависимости от оценки критиков.
Microsoft Xbox One¶

Оценка пользователей

Диаграмма рассеяния "Объём мировых продаж — оценка пользователей".

In [203]:
actual_data[(actual_data['platform'] == 'xone') &
            (actual_data['user_score'] > 0)].plot.scatter(
    x='user_score',
    y='total_sales',
    xlabel='Оценка пользователей',
    ylabel='Объём продаж, млн копий',
    title='Диаграмма рассеяния\n"Объём мировых продаж $-$ оценка пользователей"',
    alpha=0.2,
    figsize=(6, 4))
plt.show()

Коэффициент корреляции.

In [204]:
actual_data.loc[(actual_data['platform'] == 'xone') &
                (actual_data['user_score'] > 0), 'user_score'].corr(
    actual_data.loc[(actual_data['platform'] == 'xone') &
                    (actual_data['user_score'] > 0), 'total_sales']).round(2)
Out[204]:
-0.07
  • Объём мировых продаж не коррелирует с оценкой пользователей.
  • Много игр с высоким объёмом продаж имеют пользовательскую оценку среднюю или ниже средней.

Оценка критиков

Диаграмма рассеяния "Объём мировых продаж — оценка критиков".

In [205]:
actual_data[(actual_data['platform'] == 'xone') &
            (actual_data['critic_score'] > 0)].plot.scatter(
    x='critic_score',
    y='total_sales',
    xlabel='Оценка критиков',
    ylabel='Объём продаж, млн копий',
    title='Диаграмма рассеяния\n"Объём мировых продаж $-$ оценка критиков"',
    alpha=0.2,
    figsize=(6, 4))
plt.show()

Коэффициент корреляции.

In [206]:
actual_data.loc[(actual_data['platform'] == 'xone') &
                (actual_data['critic_score'] > 0), 'critic_score'].corr(
    actual_data.loc[(actual_data['platform'] == 'xone') &
                    (actual_data['critic_score'] > 0), 'total_sales']).round(2)
Out[206]:
0.42

График зависимости медианного значения объёма мировых продаж от оценки критиков.

In [207]:
actual_data[(actual_data['platform'] == 'xone') &
            (actual_data['critic_score'] > 0)] \
    .groupby('critic_score')['total_sales'].agg('median').plot(figsize=(6, 4))
plt.xlabel('Оценка критиков')
plt.ylabel('Объём продаж, млн копий')
plt.title('График зависимости' +
          '\nмедианного значения объёма мировых продаж' +
          '\nот оценки критиков')
plt.show()
  • Объём мировых продаж умеренно коррелирует с оценкой критиков.
  • Зависимость не является линейной, но носит возрастающий характер.
  • У игр, имеющих высокую оценку критиков, высокий объём мировых продаж. И, наоборот, игры, получившие среднюю оценку или ниже средней, характеризуются низким объёмом мировых продаж.
  • Для оценок критиков до 75 баллов наблюдается пологий рост объёма продаж.
  • С дальнейшим ростом оценки критиков наблюдается более интенсивный рост объёмов продаж, достигающий в среднем 1 млн копий для игр с оценкой в 90 баллов.
  • Тенденция отчётливо наблюдается на графике медианных значений объёмов продаж в зависимости от оценки критиков.
Персональный компьютер¶

Оценка пользователей

Диаграмма рассеяния "Объём мировых продаж — оценка пользователей".

In [208]:
actual_data[(actual_data['platform'] == 'pc') &
            (actual_data['user_score'] > 0)].plot.scatter(
    x='user_score',
    y='total_sales',
    xlabel='Оценка пользователей',
    ylabel='Объём продаж, млн копий',
    title='Диаграмма рассеяния\n"Объём мировых продаж $-$ оценка пользователей"',
    alpha=0.2,
    figsize=(6, 4))
plt.show()

Коэффициент корреляции.

In [209]:
actual_data.loc[(actual_data['platform'] == 'pc') &
                (actual_data['user_score'] > 0), 'user_score'].corr(
    actual_data.loc[(actual_data['platform'] == 'pc') &
                    (actual_data['user_score'] > 0), 'total_sales']).round(2)
Out[209]:
-0.12
  • Объём мировых продаж не коррелирует с оценкой пользователей.
  • Много игр с высоким объёмом продаж имеют пользовательскую оценку среднюю или ниже средней.

Оценка критиков

Диаграмма рассеяния "Объём мировых продаж — оценка критиков".

In [210]:
actual_data[(actual_data['platform'] == 'pc') &
            (actual_data['critic_score'] > 0)].plot.scatter(
    x='critic_score',
    y='total_sales',
    xlabel='Оценка критиков',
    ylabel='Объём продаж, млн копий',
    title='Диаграмма рассеяния\n"Объём мировых продаж $-$ оценка критиков"',
    alpha=0.2,
    figsize=(6, 4))
plt.show()

Коэффициент корреляции.

In [211]:
actual_data.loc[(actual_data['platform'] == 'pc') &
                (actual_data['critic_score'] > 0), 'critic_score'].corr(
    actual_data.loc[(actual_data['platform'] == 'pc') &
                    (actual_data['critic_score'] > 0), 'total_sales']).round(2)
Out[211]:
0.24

График зависимости медианного значения объёма мировых продаж от оценки критиков.

In [212]:
actual_data[(actual_data['platform'] == 'pc') &
            (actual_data['critic_score'] > 0)] \
    .groupby('critic_score')['total_sales'].agg('median').plot(figsize=(6, 4))
plt.xlabel('Оценка критиков')
plt.ylabel('Объём продаж, млн копий')
plt.title('График зависимости' +
          '\nмедианного значения объёма мировых продаж' +
          '\nот оценки критиков')
plt.show()
  • Объём мировых продаж слабо коррелирует с оценкой критиков.
  • Большое количество игр, имеющих высокий объём продаж, не получили высокую оценку критиков. И наоборот, есть игры с высокой оценкой критиков, но низким объёмом продаж. Всё это добавляет шума на графике зависимости медианных значений объёмов продаж от оценки критиков.
  • Однако на графике медианных значений объёмов продаж хоть и слабо заметен, но всё же можно наблюдать рост объёмов продаж с ростом оценки критиков. И также наблюдается "излом" в области 70 баллов.
Корреляция оценок критиков и пользователей¶

Диаграмма рассеяния "Оценка пользователей — оценка критиков"

In [213]:
actual_data.loc[(actual_data['critic_score'] > 0) &
                (actual_data['user_score'] > 0)].plot.scatter(
    x='critic_score',
    y='user_score',
    xlabel='Оценка критиков',
    ylabel='Оценка пользователей',
    title='Диаграмма рассеяния\n"Оценка пользователей $-$ оценка критиков"',
    alpha=0.2,
    figsize=(6, 4))
plt.show()

Коэффициент корреляции.

In [214]:
actual_data.loc[(actual_data['critic_score'] > 0) &
                (actual_data['user_score'] > 0), 'critic_score'].corr(
    actual_data.loc[(actual_data['critic_score'] > 0) &
                    (actual_data['user_score'] > 0), 'user_score']).round(2)
Out[214]:
0.52

График сравнения медианных значений оценок пользователей и оценок критиков.

In [215]:
actual_data.loc[(actual_data['critic_score'] > 0) &
                (actual_data['user_score'] > 0)] \
    .groupby('critic_score')['user_score'].agg('median').plot(figsize=(6, 4))
plt.xlabel('Оценка критиков')
plt.ylabel('Оценка пользователей')
plt.title('График зависимости' +
          '\nмедианных значений оценок пользователей и' +
          '\nоценок критиков')
plt.show()
  • И хотя объёмы продаж не коррелируют с оценками пользователей, важно всё-таки понимать насколько продаваемые игры буду удовлетворять пользователей.
  • В целом, можно утверждать, что и пользователи, и критики формируют об игре схожее мнение.
  • В среднем высокой оценке критиков соответствует высокая оценка пользователей, низкой оценке критиков — низкая оценка пользователей.
  • Пользователи, однако, в среднем занижают оценку для игр, высоко оценённых критиками: там, где критики ставят 9 баллов из 10, пользователи ставят 8 баллов из 10.
  • И наоборот, пользователи ставят оценку выше средней тем играм, которые критики оценили ниже среднего: если критики оценивают игру на 4 балла из 10, то пользователи в среднем оценивают её на 6 баллов из 10.
  • Сходятся критики и пользователи во мнениях, когда выставляют игре оценку в интервале от 5 до 7 баллов из 10.
  • И хотя на диаграмме рассеяния наблюдается большой разброс значений, очевидна тенденция, что высоко оценённую критиками игру пользователи оценят также высоко.

Распределение пропусков в значениях оценок критиков и пользователей и в значениях рейтинга ESRB

In [216]:
sns.heatmap(
    actual_data.replace([-1, 'nd'], np.nan).sort_values(
        by=['rating', 'producer', 'platform', 'genre']).isna(),
    cmap=sns.color_palette(['#000000', '#ffffff'])
)
plt.title('Тепловая карта\nраспределения пропущенных значений')
plt.xlabel('Название признака')
plt.ylabel('Номер записи')
plt.show()
  • Тенденция, характерная для игр из всего набора данных, сохраняется и для игр актуального для прогноза перечня. Игры без рейтинга ESRB практически всегда остаются неоценёнными критиками и пользователями. А таких игр почти половина.

Распределение игр по жанрам¶

Диаграмма распределения.

In [217]:
actual_data['genre'].value_counts().sort_index().plot.bar(
    rot=0,
    title='Диаграмма распределения игр по жанрам',
    xlabel='Жанр игры',
    ylabel='Количество выпущенных игр',
    figsize=(12, 4))
plt.show()

Диаграммы размаха значений объёмов продаж по миру для игр каждого жанра.

In [218]:
actual_data.pivot_table(index='name',
                        columns='genre',
                        values='total_sales'
                       ).plot.box(
    xlabel='Жанр игры',
    ylabel='Объём продаж, млн копий',
    title='Диаграмма размаха' +
          'распределения игр по объёму мировых продаж для разных платформ',
    ylim=(0, 3.5),
    figsize=(12, 5)
)
plt.show()

Диаграмма распределения.

In [219]:
actual_data.groupby('genre')['total_sales'].agg('sum').plot.bar(
    rot=0,
    xlabel='Жанры',
    ylabel='Объём продаж, млн копий',
    title='Диаграмма распределения мирового объёма продаж игр каждого жанра',
    figsize=(12, 4))
plt.show()
  • Наибольший объём продаж имеют игры жанров экшен, шутеры и ролевые игры. Замыкают топ-5 игр с самым высоким объёмом продаж спортивные игры, а также (на одном уровне) гонки и платформеры.

  • Хуже всего продаются головоломки, стратегии и квесты.

  • Наибольшее число копий одной игры продаётся в жанре шутер. В среднем одна игра продаётся в объёме 450 тыс. копий. Причём для половины всех игр этого жанра продажи могли доходить до 1,3 млн копий. А максимальные продажи могли доходить до 3,2 млн копий.

  • Следующими по величине объёма продаж одной игры идут платформеры и спортивные игры. В среднем одна игра продаётся в объёме 250 тыс. копий (платформеры) и 200 тыс. копий (спортивные игры). Причём для половины всех игр жанра платформеры продажи могли доходить тоже до 1,3 млн копий. А максимальные продажи могли доходить до 2,2 млн копий. Максимальные продажи спортивных игр могли доходить только до 1,5 млн копий.

  • Распределение продаж игр жанра гонки почти такое же как у спортивных игр, но медианные объёмы продаж всё же ниже.

  • У лидеров по общим суммарным продажам — экшенов и ролевых игр — медианные значений объёмов продаж одной игры низкие: 100–200 тыс. копий.

  • Несмотря на низкий средний спрос на одну игру, производители игр больше всего выпускают экшены (1000 наименований). Ролевые игры идут на втором месте: их выпущено почти в 2,5 раза меньше, чем экшенов (400 наименований).

  • На третьем месте находятся квесты (300 наименований), но объём продаж у них низкий.

  • Другие игры, лидирующие по объёмам продаж — шутеры и спортивные игры, выпущены по 250–300 наименований.

  • А вот платформеров выпускается мало, хотя спрос на них высок.

  • Головоломки и стратегии выпускаются также мало, как и продаются: поэтому они полностью покрывают спрос на них.

  • Хотя нам не известна стоимость игр, но считая, что она для разных игр находится приблизительно на одинаковом уровне, можно полагать, что играми самых прибыльных жанров окажутся игры с высоким средним объёмом продаж: шутеры, платформеры и спортивные игры.

Распределение предпочтений по регионам¶

Пользователь из Северной Америки¶

Распределение долей платформ в объёме продаж.

In [220]:
sales = actual_data.groupby('platform')['na_sales'].agg(['count', 'sum']).join(
(actual_data.groupby('platform')['na_sales'].agg('sum') /
 actual_data['na_sales'].sum() * 100).round(1)) \
.reset_index().rename(columns={
    'platform': 'Платформа',
    'count':
    'Количество выпущеных игр',
    'sum': 'Объём продаж, млн копий',
    'na_sales': 'Доля в объёме продаж, %'
})
sales.sort_values(by='Доля в объёме продаж, %', ascending=False).head(5)
Out[220]:
Платформа Количество выпущеных игр Объём продаж, млн копий Доля в объёме продаж, %
9 x360 295 140.12 23.7
4 ps4 392 108.74 18.4
3 ps3 493 103.44 17.5
10 xone 247 93.12 15.8
0 3ds 398 55.31 9.4

Распределение долей жанров в объёме продаж игр (топ-5 самых популярных жанров).

In [221]:
sales = actual_data.groupby('genre')['na_sales'].agg(['count', 'sum']).join(
(actual_data.groupby('genre')['na_sales'].agg('sum') /
 actual_data['na_sales'].sum() * 100).round(1)) \
.reset_index().rename(columns={
    'genre': 'Жанр',
    'count': 'Количество выпущеных игр',
    'sum': 'Объём продаж, млн копий',
    'na_sales': 'Доля в объёме продаж, %'
})
sales.sort_values(by='Доля в объёме продаж, %', ascending=False).head(5)
Out[221]:
Жанр Количество выпущеных игр Объём продаж, млн копий Доля в объёме продаж, %
0 action 1034 177.92 30.1
8 shooter 238 144.79 24.5
10 sports 268 81.53 13.8
7 role-playing 371 64.00 10.8
3 misc 192 38.19 6.5

Диаграммы размаха значений объёмов продаж игр с определённым рейтингом ESRB (и определённым минимальным возрастом пользователя).

In [222]:
actual_data[(actual_data['age'] != 100) &
            (actual_data['age'] != 3)].pivot_table(
    index='name', columns='age', values='na_sales', aggfunc='sum').plot.box(
    ylim=(-0.05, 2.5),
    xlabel='Минимальный возраст (согласно рейтингу ESRB)',
    ylabel='Объём продаж, млн копий',
    title='Диаграмма размаха' +
          '\nраспределения игр по объёму продаж' +
          '\nв Северной Америке' +
          '\nдля разных возрастных категорий',
    figsize=(6, 4)
)
plt.show()

Диаграмма распределения.

In [223]:
actual_data[(actual_data['age'] != 100) &
            (actual_data['age'] != 3)] \
    .groupby('age')['na_sales'].agg('sum').plot.bar(
    rot=0,
    xlabel='Минимальный возраст (согласно рейтингу ESRB)',
    ylabel='Объём продаж, млн копий',
    title='Диаграмма распределения' +
          '\nобъёмов продаж игр' +
          '\nв Северной Америке' +
          '\nдля разных возрастных категорий',
    figsize=(6, 3)
)
plt.show()
  • Наибольшим спросом пользуются платформы Microsoft Xbox 360, Sony PlayStation 4 и PlayStation 3, занимающие 24 %, 18 % и 18 % рынка, соответственно.
  • Замыкают топ-5 платформы Microsoft Xbox One и Nintendo 3DS, занимающие 16 % и 9 %, соответственно.
  • Пользователи предпочитают играть в экшены и шутеры (30 % и 25 % рынка, соответственно), во вторую очередь в спортивные и ролевые игры (14 % и 11 % рынка, соответственно).
  • Игра имеет более высокий объём продаж, если ей присвоена категория рейтинга ESRB.
  • В среднем игры с рейтингами "Для всех" и "Для детей от 10 лет" продаются на уровне 200 тыс. копий, а с рейтингом "Для подростков от 17 лет" — на уровне 350 тыс. копий.
  • Для половины всех игр в каждой категории продажи одной игры могут достигать значений 450 тыс. ("Для всех"), 500 тыс. ("Для детей от 10 лет") и 1 млн ("Для подростков от 17 лет") копий.
  • Если игра не имеет категории рейтинга ESRB, то её средний объём продаж находится на уровне десятка тысяч копий.
  • Несмотря на отсутствие категории ESRB, общий объём продаж для таких игр сопоставим с объёмом продаж игр категории "Для детей от 10 лет". Больший объём продаж имеют категории "Для всех" и "Для подростков от 17 лет".
  • Однако если сравнивать объёмы продаж игр в зависимости от наличия категории рейтинга ESRB, то можно утверждать, что объём продаж игр с присвоенным рейтингом в 5 раз выше объёма продаж игр без рейтинга. Хотя количество таких игр соотносится практически как 1 : 1.
Пользователь из Европы¶

Распределение долей платформ в объёме продаж.

In [224]:
sales = actual_data.groupby('platform')['eu_sales'].agg(['count', 'sum']).join(
(actual_data.groupby('platform')['eu_sales'].agg('sum') /
 actual_data['eu_sales'].sum() * 100).round(1)) \
.reset_index().rename(columns={
    'platform': 'Платформа',
    'count':
    'Количество выпущеных игр',
    'sum': 'Объём продаж, млн копий',
    'eu_sales': 'Доля в объёме продаж, %'
})
sales.sort_values(by='Доля в объёме продаж, %', ascending=False).head(5)
Out[224]:
Платформа Количество выпущеных игр Объём продаж, млн копий Доля в объёме продаж, %
4 ps4 392 141.09 27.8
3 ps3 493 106.86 21.1
9 x360 295 74.55 14.7
10 xone 247 51.59 10.2
0 3ds 398 42.64 8.4

Распределение долей жанров в объёме продаж игр (топ-5 самых популярных жанров).

In [225]:
sales = actual_data.groupby('genre')['eu_sales'].agg(['count', 'sum']).join(
(actual_data.groupby('genre')['eu_sales'].agg('sum') /
 actual_data['eu_sales'].sum() * 100).round(1)) \
.reset_index().rename(columns={
    'genre': 'Жанр',
    'count': 'Количество выпущеных игр',
    'sum': 'Объём продаж, млн копий',
    'eu_sales': 'Доля в объёме продаж, %'
})
sales.sort_values(by='Доля в объёме продаж, %', ascending=False).head(5)
Out[225]:
Жанр Количество выпущеных игр Объём продаж, млн копий Доля в объёме продаж, %
0 action 1034 159.82 31.5
8 shooter 238 113.50 22.4
10 sports 268 69.09 13.6
7 role-playing 371 48.53 9.6
6 racing 115 27.29 5.4

Диаграммы размаха значений объёмов продаж игр с определённым рейтингом ESRB (и определённым минимальным возрастом пользователя).

In [226]:
actual_data[(actual_data['age'] != 100) & (actual_data['age'] != 3)].pivot_table(
    index='name', columns='age', values='eu_sales', aggfunc='sum').plot.box(
    ylim=(-0.05, 2),
    xlabel='Минимальный возраст (согласно рейтингу ESRB)',
    ylabel='Объём продаж, млн копий',
    title='Диаграмма размаха' +
          '\nраспределения игр по объёму продаж' +
          '\nв Европе' +
          '\nдля разных возрастных категорий',
    figsize=(6, 4)
)
plt.show()

Диаграмма распределения.

In [227]:
actual_data[(actual_data['age'] != 100) &
            (actual_data['age'] != 3)] \
    .groupby('age')['eu_sales'].agg('sum').plot.bar(
    rot=0,
    xlabel='Минимальный возраст (согласно рейтингу ESRB)',
    ylabel='Объём продаж, млн копий',
    title='Диаграмма размаха' +
          '\nраспределения объёмов продаж игр' +
          '\nв Европе' +
          '\nдля разных возрастных категорий',
    figsize=(6, 3)
)
plt.show()
  • Наибольшим спросом пользуются платформы Sony PlayStation 4 и PlayStation 3, а также Microsoft Xbox 360, занимающие 28 %, 21 % и 15 % рынка, соответственно.
  • Замыкают топ-5 платформы Microsoft Xbox One и Nintendo 3DS, занимающие каждая 10 % и 8 % рынка, соответственно.
  • Пользователи предпочитают играть в экшены и шутеры (32 % и 22 % рынка, соответственно), во вторую очередь в спортивные и ролевые игры (14 % и 10 % рынка, соответственно).
  • Распределение популярных платформ и жанров в Европе схоже с Северной Америкой.
  • Игра имеет более высокий объём продаж, если ей присвоена категория рейтинга ESRB.
  • В среднем игры с рейтингами "Для всех" и "Для детей от 10 лет" продаются на уровне 100 тыс. копий, а с рейтингом "Для подростков от 17 лет" — на уровне 250 тыс. копий.
  • Для половины всех игр в каждой категории продажи одной игры могут достигать значений 350 тыс. ("Для всех" и "Для детей от 10 лет") и 850 тыс. ("Для подростков от 17 лет") копий.
  • Если игра не имеет категории рейтинга ESRB, то её средний объём продаж находится на уровне десятка тысяч копий.
  • Несмотря на отсутствие категории ESRB, общий объём продаж для таких игр сопоставим с объёмом продаж игр категории "Для всех". Больший объём продаж имеют категории "Для всех" и "Для подростков от 17 лет".
  • Однако если сравнивать объемы продаж игр в зависимости от наличия категории рейтинга ESRB, то можно утверждать, что объём продаж игр с присвоенным рейтингом в 4,5 раза выше объёма продаж игр без рейтинга. Хотя количество таких игр соотносится практически как 1 : 1.
Пользователь из Японии¶

Распределение долей платформ в объёме продаж.

In [228]:
sales = actual_data.groupby('platform')['jp_sales'].agg(['count', 'sum']).join(
(actual_data.groupby('platform')['jp_sales'].agg('sum') /
 actual_data['jp_sales'].sum() * 100).round(1)) \
.reset_index().rename(columns={
    'platform': 'Платформа',
    'count':
    'Количество выпущеных игр',
    'sum': 'Объём продаж, млн копий',
    'jp_sales': 'Доля в объёме продаж, %'
})
sales.sort_values(by='Доля в объёме продаж, %', ascending=False).head(5)
Out[228]:
Платформа Количество выпущеных игр Объём продаж, млн копий Доля в объёме продаж, %
0 3ds 398 87.84 45.6
3 ps3 493 35.29 18.3
6 psv 411 21.04 10.9
4 ps4 392 15.96 8.3
8 wiiu 147 13.01 6.7

Распределение долей жанров в объёме продаж игр (топ-5 самых популярных жанров).

In [229]:
sales = actual_data.groupby('genre')['jp_sales'].agg(['count', 'sum']).join(
(actual_data.groupby('genre')['jp_sales'].agg('sum') /
 actual_data['jp_sales'].sum() * 100).round(1)) \
.reset_index().rename(columns={
    'genre': 'Жанр',
    'count': 'Количество выпущеных игр',
    'sum': 'Объём продаж, млн копий',
    'jp_sales': 'Доля в объёме продаж, %'
})
sales.sort_values(by='Доля в объёме продаж, %', ascending=False).head(5)
Out[229]:
Жанр Количество выпущеных игр Объём продаж, млн копий Доля в объёме продаж, %
7 role-playing 371 65.47 34.0
0 action 1034 52.80 27.4
3 misc 192 12.86 6.7
9 simulation 83 10.41 5.4
2 fighting 109 9.44 4.9

Диаграммы размаха значений объёмов продаж игр с определённым рейтингом ESRB (и определённым минимальным возрастом пользователя).

In [230]:
actual_data[(actual_data['age'] != 100) & (actual_data['age'] != 3)].pivot_table(
    index='name', columns='age', values='jp_sales', aggfunc='sum').plot.box(
    ylim=(-0.01, 0.4),
    xlabel='Минимальный возраст (согласно рейтингу ESRB)',
    ylabel='Объём продаж, млн копий',
    title='Диаграмма размаха' +
          '\nраспределения игр по объёму продаж' +
          '\nв Японии' +
          '\nдля разных возрастных категорий',
    figsize=(6, 4)
)
plt.show()

Диаграмма распределения.

In [231]:
actual_data[(actual_data['age'] != 100) &
            (actual_data['age'] != 3)] \
    .groupby('age')['jp_sales'].agg('sum').plot.bar(
    rot=0,
    xlabel='Минимальный возраст (согласно рейтингу ESRB)',
    ylabel='Объём продаж, млн копий',
    title='Диаграмма размаха' +
          '\nраспределения объёмов продаж игр' +
          '\nв Японии' +
          '\nдля разных возрастных категорий',
    figsize=(6, 3)
)
plt.show()
  • Распределение предпочтений пользователей из Японии кардинальным образом отличается от предпочтений американских и европейских пользователей.
  • Наибольшим спросом пользуются платформы Nintendo 3DS, Sony PlayStation 3 и Sony PlayStation Vita, занимающие 46 %, 18 % и 11 % рынка, соответственно.
  • Замыкают топ-5 платформы Sony PlayStation 4 и Nintendo WiiU, занимающие 8 % и 7 % рынка, соответственно.
  • Не пользуются спросом платформа Microsoft Xbox One и персональный компьютер.
  • Пользователи преимущественно предпочитают играть в ролевые игры и экшены (34 % и 27 % рынка, соответственно), остальные жанры не пользуются большим спросом (менее 7 % от объёма рынка).
  • Игра имеет более высокий объём продаж, если ей не присвоена категория рейтинга ESRB. Видимо, поскольку организация ESRB ведёт свою деятельность в США, то прежде всего работает с играми, распространяемыми на территории США. В Японии же выпускается много игр, распространяемых только на территории Японии, поэтому они зачастую не имеют рейтинга ESRB.
  • В среднем игры без рейтинга продаются на уровне 30 тыс. копий.
  • Среди игр с присвоенным рейтингом ESRB наибольшим спросом пользуются игры категории "Для подростков от 17 лет" (со средним объёмом продаж одной игры в 40 тыс. копий).
  • Несмотря на отсутствие категории ESRB, общий объём продаж таких игр является наибольшим.
  • Однако если сравнивать объёмы продаж игр в зависимости от наличия категории рейтинга ESRB, то можно утверждать, что объём продаж игр с присвоенным рейтингом сопоставим с объёмом продаж игр без рейтинга.
Пользователь из других регионов¶

Распределение долей платформ в объёме продаж.

In [232]:
sales = actual_data.groupby('platform')['other_sales'].agg(['count', 'sum']).join(
(actual_data.groupby('platform')['other_sales'].agg('sum') /
 actual_data['other_sales'].sum() * 100).round(1)) \
.reset_index().rename(columns={
    'platform': 'Платформа',
    'count':
    'Количество выпущеных игр',
    'sum': 'Объём продаж, млн копий',
    'other_sales': 'Доля в объёме продаж, %'
})
sales.sort_values(by='Доля в объёме продаж, %', ascending=False).head(5)
Out[232]:
Платформа Количество выпущеных игр Объём продаж, млн копий Доля в объёме продаж, %
4 ps4 392 48.35 30.9
3 ps3 493 43.27 27.7
9 x360 295 20.41 13.1
10 xone 247 14.27 9.1
0 3ds 398 8.87 5.7

Распределение долей жанров в объёме продаж игр (топ-5 самых популярных жанров).

In [233]:
sales = actual_data.groupby('genre')['other_sales'].agg(['count', 'sum']).join(
(actual_data.groupby('genre')['other_sales'].agg('sum') /
 actual_data['other_sales'].sum() * 100).round(1)) \
.reset_index().rename(columns={
    'genre': 'Жанр',
    'count': 'Количество выпущеных игр',
    'sum': 'Объём продаж, млн копий',
    'other_sales': 'Доля в объёме продаж, %'
})
sales.sort_values(by='Доля в объёме продаж, %', ascending=False).head(5)
Out[233]:
Жанр Количество выпущеных игр Объём продаж, млн копий Доля в объёме продаж, %
0 action 1034 51.21 32.8
8 shooter 238 37.26 23.8
10 sports 268 22.44 14.4
7 role-playing 371 14.83 9.5
3 misc 192 7.67 4.9

Диаграммы размаха значений объёмов продаж игр с определённым рейтингом ESRB (и определённым минимальным возрастом пользователя).

In [234]:
actual_data[(actual_data['age'] != 100) & (actual_data['age'] != 3)].pivot_table(
    index='name', columns='age', values='other_sales', aggfunc='sum').plot.box(
    ylim=(-0.01, 0.65),
    xlabel='Минимальный возраст (согласно рейтингу ESRB)',
    ylabel='Объём продаж, млн копий',
    title='Диаграмма размаха' +
          '\nраспределения игр по объёму продаж' +
          '\nв других регионах' +
          '\nдля разных возрастных категорий',
    figsize=(6, 4)
)
plt.show()

Диаграмма распределения.

In [235]:
actual_data[(actual_data['age'] != 100) &
            (actual_data['age'] != 3)] \
    .groupby('age')['other_sales'].agg('sum').plot.bar(
    rot=0,
    xlabel='Минимальный возраст (согласно рейтингу ESRB)',
    ylabel='Объём продаж, млн копий',
    title='Диаграмма размаха' +
          '\nраспределения объёмов продаж игр' +
          '\nв других регионах' +
          '\nдля разных возрастных категорий',
    figsize=(6, 3)
)
plt.show()
  • Наибольшим спросом пользуются платформы Sony PlayStation 4 и PlayStation 3, Microsoft Xbox 360, занимающие 31 %, 28 % и 13 % рынка, соответственно.
  • Замыкают топ-5 платформы Microsoft Xbox One и Nintendo 3DS, занимающие 9 % и 6 % рынка, соответственно.
  • Пользователи предпочитают играть в экшены и шутеры (33 % и 24 % рынка, соответственно), во вторую очередь в спортивные и ролевые игры (14 % и 10 % рынка, соответственно).
  • Игра имеет более высокий объём продаж, если ей присвоена категория рейтинга ESRB.
  • В среднем игры с рейтингом "Для подростков от 17 лет" продаются на уровне 90 тыс. копий, игры с рейтингами "Для детей от 10 лет" и "Для всех" продаются на уровне 25 тыс. копий.
  • Для половины всех игр в каждой категории продажи одной игры могут достигать значений 230 тыс. ("Для всех"), 200 тыс. ("Для детей от 10 лет") и 600 тыс. ("Для подростков от 17 лет") копий.
  • Если игра не имеет категории рейтинга ESRB, то её средний объём продаж находится на уровне десятка тысяч копий.
  • Несмотря на отсутствие категории ESRB, общий объём продаж для таких игр сопоставим с объёмом продаж игр категории "Для всех". Больший объём продаж имеет только категория "Для подростков от 17 лет".
  • Однако если сравнивать объёмы продаж игр в зависимости от наличия категории рейтинга ESRB, то можно утверждать, что объём продаж игр с присвоенным рейтингом в 4 раза выше объёма продаж игр без рейтинга. Хотя количество таких игр относится практически как 1 : 1.
  • Распределение предпочтений в остальных регионах схоже с распределением предпочтений американских и европейских пользователей.

Проверка гипотез¶

Нулевую гипотезу сформулируем так, чтобы использовался знак равенства. Поэтому при проверке гипотезы о равенстве средних двух совокупностей нулевая гипотеза будет звучать так: «да, средние двух выборок равны». Если будем выяснять, есть ли разница между совокупностями, то нулевая гипотеза будет такая: «разницы между средними двух выборок нет, средние равны».

Альтернативную гипотезу сформулируем путём отрицания нулевой гипотезы. Такая альтернативная гипотеза будет двусторонней, потому что есть возможное отклонение и в большую, и в меньшую стороны.

Поскольку значений в выборках много (больше 50), можно использовать t-статистику, так как при таком объёме выборки распределение Стьюдента приближается к нормальному распределению.

Сравнение оценок платформы Xbox One и персонального компьютера¶

Сформулируем нулевую и альтернативную гипотезы.

$H_0:$ средние пользовательские оценки игр для платформы Xbox One и персонального компьютера равны.
$H_1:$ средние пользовательские оценки игр для платформы Xbox One и персонального компьютера разные.

Проверим нулевую гипотезу о равенстве двух средних при уровне статистической значимости равном 0,05.

In [236]:
alpha = .05

results = st.ttest_ind(
    actual_data.loc[(actual_data['platform'] == 'xone') &
                    (actual_data['user_score'] >= 0), 'user_score'],
    actual_data.loc[(actual_data['platform'] == 'pc') &
                    (actual_data['user_score'] >= 0), 'user_score']
)

print('p-значение:', results.pvalue.round(3))

if results.pvalue < alpha:
    print("Отвергаем нулевую гипотезу")
else:
    print("Не получилось отвергнуть нулевую гипотезу")
p-значение: 0.564
Не получилось отвергнуть нулевую гипотезу

Результат проверки: нулевая гипотеза о равенстве средних пользовательских оценок игр для платформы Xbox One и персонального компьютера может быть принята.

Средние пользовательские оценки игр для платформы Xbox One и персонального компьютера равны.

In [237]:
print('Средняя пользовательская оценка игр для платформы Xbox One:',
      actual_data.loc[(actual_data['platform'] == 'xone') &
                      (actual_data['user_score'] >= 0),
                      'user_score'].mean().round(1))

print('Средняя пользовательская оценка игр для персонального компьютера:',
      actual_data.loc[(actual_data['platform'] == 'pc') &
                      (actual_data['user_score'] >= 0),
                      'user_score'].mean().round(1))
Средняя пользовательская оценка игр для платформы Xbox One: 6.5
Средняя пользовательская оценка игр для персонального компьютера: 6.4

Сравнение оценок жанров экшен и спортивные игры¶

Сформулируем нулевую и альтернативную гипотезы.

$H_0:$ средние пользовательские оценки жанров экшен и спортивные игры равны.
$H_1:$ средние пользовательские оценки жанров экшен и спортивные игры разные.

Проверим нулевую гипотезу о равенстве двух средних при уровне статистической значимости равном 0,05.

In [238]:
alpha = .05

results = st.ttest_ind(
    actual_data.loc[(actual_data['genre'] == 'action') &
                    (actual_data['user_score'] >= 0), 'user_score'],
    actual_data.loc[(actual_data['genre'] == 'sports') &
                    (actual_data['user_score'] >= 0), 'user_score']
)

print('p-значение:', f'{results.pvalue:.1}')

if results.pvalue < alpha:
    print("Отвергаем нулевую гипотезу")
else:
    print("Не получилось отвергнуть нулевую гипотезу")
p-значение: 4e-26
Отвергаем нулевую гипотезу

Результат проверки: нулевая гипотеза о равенстве средних пользовательских оценок для игр жанров экшен и спортивные игры не может быть принята. Может быть принята альтернативная гипотеза о наличии различий в средних пользовательских оценках для игр жанров экшен и спортивные игры.

Средние оценки пользователей для игр жанра экшен и спортивные игры различны, различия достоверны при p < 0,001.

In [239]:
print('Средняя пользовательская оценка игр жанра экшен:',
      actual_data.loc[(actual_data['genre'] == 'action') &
                      (actual_data['user_score'] >= 0),
                      'user_score'].mean().round(1))
print('Средняя пользовательская оценка игр жанра спортивные игры:',
      actual_data.loc[(actual_data['genre'] == 'sports') &
                      (actual_data['user_score'] >= 0),
                      'user_score'].mean().round(1))
Средняя пользовательская оценка игр жанра экшен: 6.8
Средняя пользовательская оценка игр жанра спортивные игры: 5.5

Общий вывод¶

*Характеристики компьютерных игр*

Рассмотренные нами данные охватывают временной период в 40 лет: с 1977 по 2016 год. В течение этого срока было выпущено более 16,5 тысяч компьютерных игр. Новые игры выпускались каждый год.

Наименее продуктивными были 1977-1990 года, тогда выпускалось не более 50 игр в год. Рост количества выпускаемых в год игр стал заметен в середине 1990-х годов. К 2000-му году количество выпускаемых в год игр перевалило за 300 и к этому моменту не снижалось уже на протяжении трёх лет. С ещё большими темпами рост наблюдался в 2000-х годах и к концу первого десятилетия XXI века достиг своего максимума.

Большинство игр выпускалось с 1997 года, то есть в течение последних 20 лет. Самым продуктивным десятилетием было время с 2002 по 2011 года, тогда в свет выходило не менее 750 игр каждый год. Самыми продуктивными были 2008 и 2009 года, тогда было выпущено по 1400 новых игр. После 2011 года количество выпускаемых в год игр сократилось в два раза и к 2016 году сохраняется на уровне 600 новых игр в год.

Своеобразным экватором стал 2007 год: к этому моменту было произведено 50 % всех, остальные 50 % были выпущены на рынок с 2007 по 2016 года. Таким образом, за последние 10 лет мир увидел половину из когда-либо выпущенных компьютерных игр. А индустрия компьютерных игр воспроизвела свой объём.

За 40 лет сменилось 7 поколений игровых систем. Если для 2-го и 3-го поколений игровых систем выпускалось около 100–150 игр, то начиная с 4-го поколения игровых систем количество выпускавшихся игр начало расти. И каждый раз, при смене поколений количество выпускавшихся новых игр увеличивалось почти в два раза. Пик пришёлся на 7-е поколение. Для игровых систем этого поколения было выпущено 7800 игр, что составляет около 50 % всех игр. Количество игр для игровых систем последнего, 8-го поколения снизилось почти в два раза по сравнению с системами 7-го поколения. Однако итоговые оценки для игровых систем 8-го поколения делать рано.

Все игры выпущены для игровых платформ различных поколений. Среди них 30 игровых приставок 8 производителей, а также персональный компьютер. Среди производителей игровых платформ можно выделить тройку лидеров: Sony, Nintendo и Microsoft. Именно они на 2016 год продолжают свою деятельность в индустрии игровых консолей. Всего на тройку лидеров приходится более 91 % всех игр. Наибольшее количество игр было выпущено для игровых приставок производства Sony и Nintendo — 40 % и 37 % от общего числа игр, соответственно. Замыкает тройку лидеров Microsoft: для приставок её производства было выпущено игр почти в 3 раза меньше — 14 % всех игр.

Лидерами среди игровых платформ по количеству выпущенных за всё время для них игр являются Sony PlayStation 2 и Nintendo DS. Их доли на рынке одинаковые, а вместе на них приходится около 25 % всех игр. Кроме этих платформ в топ-10 по количеству выпущенных игр входят Sony PlayStation и PlayStation 3, Nintendo Wii и Microsoft Xbox 360. Для каждой из них было выпущено игр в 1,7 раз меньше по сравнению с лидерами. Для всех этих платформ выпущено более 1000 разных игр. Для остальных платформ выпущено меньшее количество игр. Своеобразной границей служит выступающий в качестве игровой платформы персональный компьютер. Для него было выпущено почти 1000 игр. Замыкают топ-10 платформы Microsoft Xbox и Nintendo Game Boy Advance. На все игровые платформы из топ-10 приходится почти 80 % всех выпущенных игр.

75 % игр были выпущены единожды. 25 % игр были выпущены несколько раз: в разные годы и/или для разных игровых платформ. Например, игра Need for speed: most wanted перевыпускалась 12 раз для разных платформ и в разных года, а Lego marvel super heroes, FIFA 14, Ratatouille, Madden NFL 07 выпускались по 9 раз каждая на разных платформах.

Игры разделены по 11 основным жанрам, которые охватывают 90 % всех игр. Наибольшее количество игр представлено в жанре экшен — 20 % всех игр. Примерно в 1,5 раза меньше представлено спортивных игр. Вместе на двух лидеров приходится 34 % всех выпущенных игр. В 2 раза меньше, чем у лидера представлен каждый из жанров: ролевые игры, шутер, квест и гонки. Ещё меньше игр жанров платформеры, симулятора и файтинги. Замыкают список жанров стратегии и квесты-головоломки.

*Распределение оценок и рейтинговая система*

Из всех игр только для 46 % пользователи поставили оценку. Оценки выставлялись по 10-балльной шкале с шагом 0,1 балла. Минимальная выставленная оценка — 0, максимальная — 9,7. Большинство оценённых игр имеют оценку не менее 4. Пользователи ставили достаточно высокие оценки: в среднем — 7 баллов из 10. А половина всех оценённых игр имеет оценку не ниже 7,5. Максимальное число оценок приходится на интервал от 7 до 9. Самая распространённая оценка — 7,8. Всё это позволяет утверждать, что пользователи достаточно лояльно относятся к тем играм, которые оценивали. И что, вероятно, мотивацией к выставлению оценки послужило именно хорошее впечатление об игре.

Количество оценённых критиками игр почти такое же, как оценённое пользователями. Только для 49 % всех игр критики поставили оценку. Минимальная выставленная оценка — 13, максимальная — 98. Оценки выставлялись по 100-балльной шкале с шагом 1 балл. Большинство оценённых игр имеют оценку не менее 37. Критики выставили достаточно высокие оценки: в среднем — 69 баллов из 100. А половина всех оценённых игр имеет оценку не ниже 71. Причём оценки 70 и 71 являются самыми распространёнными. Максимальное число оценок приходится на интервал 70–80. Всё это позволяет утверждать, что критики составили для себя положительное впечатление об играх и высоко их оценили.

Не все игры имеют рейтинг ESRB. Только 60 % всех игр ESRB присвоила рейтинг и возрастную категорию. Игры между категориями разделились неравномерно. Наибольшему числу игр присвоена категория Everyone ("Для всех») — 40 % от игр с присвоенной категорией. Следующая по ёмкости категория — Teen ("Для подростков от 13 лет"), 30 % от игр с присвоенной категорией. Затем идут приблизительно равные по ёмкости категории: Everyone 10+ ("Для детей от 10 лет") и Mature 17+ ("Для подростков от 17 лет»). Совместно на эти категории приходится оставшиеся 30 %.

*Характеристики продаж*

Всего за 40 лет в мире было продано более 8,9 млрд копий компьютерных игр. Минимальное количество проданных копий одной игры — 10 тыс., максимальное — 82,54 млн. В среднем по миру игры продавались в объёме 170 тыс. копий каждая. Большинство игр было продано в объёме не более 1,1 млн копий каждая. Игры, проданные в большем объёме, — явление редкое. Наиболее часто игры продаются в объёме 10–130 тыс. копий.

В Северной Америке продавалось только 73 % всех игр — более 12 тысяч наименований. Объём проданных копий достигает 4,4 млрд. Минимальное количество проданных копий одной игры — 10 тыс., максимальное — 41,36 млн. В среднем, в Северной Америке, игры продавались в объёме 140 тыс. копий каждая. Большинство игр было продано в объёме не более 750 тыс. копий каждая. Наиболее часто игры продаются в объёме 10–100 тыс. копий.

В Европе продавалось только 65 % всех игр — почти 11 тысяч наименований. Объём проданных копий достигает 2,4 млрд. Минимальное количество проданных копий одной игры — 10 тыс., максимальное — 28,96 млн. В среднем, в Европе, игры продавались в объёме 70 тыс. копий каждая. Большинство игр было продано в объёме не более 500 тыс. копий каждая. Наиболее часто игры продаются в объёме 10–120 тыс. копий.

В Японии продавалось только 37 % всех игр — более 6 тысяч наименований. Объём проданных копий достигает 1,3 млрд. Минимальное количество проданных копий одной игры — 10 тыс., максимальное — 10,22 млн. В среднем, в Японии, игры продавались в объёме 70 тыс. копий каждая. Большинство игр было продано в объёме не более 450 тыс. копий каждая. Наиболее часто игры продаются в объёме 10–100 тыс. копий.

В остальных регионах продавался только 61 % всех игр — более 10 тысяч наименований. Объём проданных копий достигает 800 млн. Минимальное количество проданных копий одной игры — 10 тыс., максимальное — 10,57 млн. В среднем игры в остальных регионах продавались в объёме 20 тыс. копий каждая. Большинство игр было продано в объёме не более 180 тыс. копий каждая. Наиболее часто игры продаются в объёме 10–100 тыс. копий.

Таким образом, наиболее ёмким является рынок компьютерных игр в регионе Северная Америка, на втором месте — Европейский союз и замыкает тройку — Япония.

*Выбор актуальных данных для построения прогноза*

Цикл жизни (то есть время оборота на рынке компьютерных игр) одного поколения игровых систем составляет примерно 10–15 лет. Появление игровых систем нового поколения приходится на середину жизненного цикла предыдущего поколения и практически всегда совпадает с уходом с рынка предпредыдущего поколения. Поэтому можно утверждать, что на рынке одновременно могут присутствовать игровые системы только двух, идущих подряд поколений. А игровые системы остальных поколений полностью вытесняются ими с рынка, поскольку игры для них перестают выпускаться разработчиками.

Смена игровых платформ у каждого производителя происходит схожим образом. Производитель выпускает на рынок новую платформу, когда продажи игр для предыдущей находятся в максимуме или уже начинают падать. Такую ситуацию можно объяснить по-разному. Выпуск новой платформы является либо следствием падения продаж игр для предыдущей платформы. Или же выпуск новой игровой платформы приводит к снижению интереса к предыдущей платформе.

В 2016 году на рынке можно найти игры для приставок 3 производителей (Sony, Nintendo и Microsoft), а также для персонального компьютера. Всего 9 игровых платформ. Среди 8 игровых приставок можно выделить Sony PlayStation 3 и PlayStation 4, портативную PlayStation Vita, Nintendo Wii и WiiU, портативную Nintendo 3DS, Microsoft Xbox 360 и Xbox One.

Жизненный цикл одной игровой приставки (особенно популярной) практически повторяет жизненный цикл поколений игровых систем: игры для одной игровой приставки выпускают на протяжении 10–12 лет. Платформы Sony PlayStation 3, Nintendo Wii и Microsoft Xbox 360 на рынке уже 11–12 лет. Максимум продаж для этих платформ уже остался в прошлом. И сейчас продажи игр для них находятся на самом низком уровне. По-видимому, поддерживаются выходом совсем небольшого числа новых игр. Наиболее вероятно, что в 2017 году они не будут актуальны.

Актуальными для прогноза продаж являются игровые платформы Sony: домашняя игровая приставка PlayStation 4 и портативная игровая приставка PlayStation Vita; платформы Nintendo: домашняя игровая приставка WiiU и портативная игровая приставка Nintendo 3DS; платформа Microsoft: домашняя игровая приставка Xbox One, а также персональный компьютер, игры для которого разрабатываются и выпускаются в стабильном режиме уже более 32 лет.

*Распределение игр по платформам*

Среди игр для домашних игровых консолей наименьший спрос получили игры для Nintendo WiiU (20 млн копий в год), в два раза больший — для Microsoft Xbox One (40 млн копий в год), и ещё в два раза больший — для Sony PlayStation 4 (80 млн копий в год). Среди игр для портативных игровых приставок меньшим спросом пользуются игры для PlayStation Vita (10 млн копий в год), а для Nintendo 3DS — в 4 раза более высоким (40 млн копий в год). Особняком стоит персональный компьютер: игры для него пользуются невысоким, но стабильным спросом — 15 млн копий в год.

Средний объём годовых продаж для PlayStation 3 и Nintendo Wii примерно на 10 млн копий меньше, чем у платформ, пришедших им на смену. Средний годовой объём продаж и размах значений у Microsoft Xbox 360 выше на 20 млн копий, чем у Xbox One. Однако объёмы продаж игр для этих платформ находятся в минимуме и уже не достигнут средних значений, поскольку продажи для них прошли максимум. Портативные игровые приставки Nintendo DS и Sony PlayStation Portable в среднем имели более низкий объём продаж, чем платформы, пришедшие им на смену.

Игры для домашних приставок в среднем пользуются большим спросом, чем игры для портативных приставок или для персонального компьютера. Одна игра для домашних приставок распространяется в среднем по 200 тыс. копий. 50 % всех игр для каждой платформы Sony PlayStation 4 или Microsoft Xbox One может продаваться в объёме 50–700 тыс. копий одной игры и в объёме 100–500 тыс. копий одной игры среди игр для Nintendo WiiU.

Средние объёмы продаж копий одной игры для Sony PlayStation 3 и Microsoft Xbox 360 находятся на таком же уровне как у платформ, пришедших им на смену. Несколько меньше, чем для Nintendo WiiU, продаётся копий одной игры для Nintendo Wii.

Для портативных игровых приставок объём продаж одной игры меньше: для PlayStation Vita — 50 тыс. копий, для Nintendo 3DS — 100 тыс. копий. Объём продаж игр для портативных приставок может достигать объёма 300 тыс. копий — для игр на Sony PlayStation Vita, 700 тыс. копий — для игр на Nintendo 3DS.

Ушедшая с рынка Sony PlayStation Portable имела объём продаж одной игры на уровне с Sony PlayStation Vita. Объём продаж одной игры для Nintendo DS был ниже, чем для Nintendo 3DS.

Игры для персонального компьютера продаются в среднем на таком же уровне, как и для портативных игровых платформ. — 100 тыс. копий. Но могут достигать отметки в 550 тыс. копий.

*Влияние оценок пользователей и критиков*

Объём мировых продаж не коррелирует с оценкой пользователей. Видимо, пользователи очень субъективно выставляют оценку. Особенно в случае, если выход игры был ожидаем (и поэтому продажи оказались высокими), а вот ожиданий пользователей игра не оправдала.

А вот с оценкой критиков у объёмов продаж есть умеренная корреляция. Зависимость не носит линейный характер, поэтому коэффициент корреляции не будет высоким. Он находится на уровне 0,29–0,42. Однако высокой оценке игры со стороны критиков соответствует высокий объём продаж и, наоборот, игры с низкой экспертной оценкой подкреплены низкими продажами. Интересен тот факт, что с увеличением оценки критиков до среднего значения в 70 баллов наблюдается медленный рост продаж. Но при дальнейшем увеличении до 90 баллов наблюдается более интенсивный рост продаж, в среднем достигающий объёмов в 1 млн проданных копий.

И хотя объёмы продаж не коррелируют с оценками пользователей, важно всё-таки понимать насколько продаваемые игры буду удовлетворять пользователей. В целом, можно утверждать, что и пользователи, и критики формируют об игре схожее мнение. В среднем высокой оценке критиков соответствует высокая оценка пользователей, низкой оценке критиков — низкая оценка пользователей. Главное, что высоко оценённые критиками и, соответственно, имеющие высокие объёмы продаж игры, вероятно, в конечном итоге, будут оценены также высоко и пользователями.

*Распределение игр по жанрам*

Наибольший объём продаж имеют игры жанров экшен, шутеры и ролевые игры. Спортивные игры и на одинаковом уровне платформеры и гонки замыкают топ-5 игр с самым высоким объёмом продаж. Хуже всего продаются головоломки, стратегии и квесты. Наибольшее число копий одной игры продаётся в жанре шутер. В среднем одна игра продаётся в объёме 450 тыс. копий. Следующими по величине объёма продаж одной игры идут платформеры и спортивные игры. В среднем одна игра продаётся в объёме 250 тыс. копий (платформеры) и 200 тыс. копий (спортивные игры). У лидеров по общим суммарным продажам — экшенов и ролевых игр — медианные значения объёмов продаж одной игры низкие: 100–200 тыс. копий.

*Портрет пользователя каждого региона*

Пользователи в Северной Америке, Европе и других регионах схожи в своих предпочтениях. Предпочтения пользователей из Японии кардинально от них отличаются.

Наибольшим спросом в Северной Америке пользуются платформы Microsoft Xbox 360, Sony PlayStation 4 и PlayStation 3, занимающие 24 %, 18 % и 18 % рынка, соответственно. Замыкают топ-5 платформы Microsoft Xbox One и Nintendo 3DS, занимающие 16 % и 9 %, соответственно. Пользователи предпочитают играть в экшены и шутеры (30 % и 25 % рынка, соответственно), во вторую очередь в спортивные и ролевые игры (14 % и 11 % рынка, соответственно). Игры будут иметь более высокий объём продаж, если им присвоена категория рейтинга ESRB. Если сравнивать объёмы продаж игр в зависимости от наличия категории рейтинга ESRB, то можно утверждать, что объём продаж игр с присвоенным рейтингом в 5 раз выше объёма продаж игр без рейтинга. Хотя количество наименований таких игр соотносится как 1 : 1.

Наибольшим спросом в Евросоюзе пользуются платформы Sony PlayStation 4 и PlayStation 3, а также Microsoft Xbox 360, занимающие 28 %, 21 % и 15 % рынка, соответственно. Замыкают топ-5 платформы Microsoft Xbox One и Nintendo 3DS, занимающие каждая 10 % и 8 % рынка, соответственно. Пользователи предпочитают играть в экшены и шутеры (32 % и 22 % рынка, соответственно), во вторую очередь в спортивные и ролевые игры (14 % и 10 % рынка, соответственно). И здесь игры будут иметь более высокий объём продаж, если им присвоена категория рейтинга ESRB: объём продаж игр с присвоенным рейтингом в 4,5 раза выше объёма продаж игр без рейтинга.

В других регионах (кроме Японии) наибольшим спросом пользуются платформы Sony PlayStation 4 и PlayStation 3, Microsoft Xbox 360, занимающие 31 %, 28 % и 13 % рынка, соответственно. Замыкают топ-5 платформы Microsoft Xbox One и Nintendo 3DS, занимающие 9 % и 6 % рынка, соответственно. Пользователи предпочитают играть в экшены и шутеры (33 % и 24 % рынка, соответственно), во вторую очередь в спортивные и ролевые игры (14 % и 10 % рынка, соответственно). Игра имеет более высокий объём продаж, если ей присвоена категория рейтинга ESRB. И в этих регионах объём продаж игр с присвоенным рейтингом в 4 раза выше объёма продаж игр без рейтинга.

Наибольшим спросом в Японии пользуются платформы Nintendo 3DS, Sony PlayStation 3 и Sony PlayStation Vita, занимающие 46 %, 18 % и 11 % рынка, соответственно. Замыкают топ-5 платформы Sony PlayStation 4 и Nintendo WiiU, занимающие 8 % и 7 % рынка, соответственно. Не пользуются спросом совсем платформа Microsoft Xbox One и персональный компьютер. Пользователи преимущественно предпочитают играть в ролевые игры и экшены (34 % и 27 % рынка, соответственно), остальные жанры не пользуются большим спросом (менее 7 % от объёма рынка). Игра имеет более высокий объём продаж, если ей не присвоена категория рейтинга ESRB. Видимо, поскольку организация ESRB ведёт свою деятельность в США, то прежде всего работает с играми, распространяемыми на территории США. В Японии же выпускается много игр, распространяемых только на территории Японии, поэтому они зачастую не имеют рейтинга ESRB.

Таким образом, можно рекомендовать в предложении интернет-магазина собрать игры:

  • для приставок Sony PlayStation 4, PlayStation Vita, Nintendo WiiU, 3DS, Microsoft Xbox One, а также для персонального компьютера;
  • исполненные в жанрах экшен, ролевые игры, шутеры, спортивные игры и платформеры (головоломки, стратегии и квесты стараться не предлагать);
  • с оценкой критиков более 80 баллов из 100.

Стоит меньше уделять внимание играм приставок Sony PlayStation 3 и PlayStation Portable, Nintendo Wii и DS, Microsoft Xbox 360, поскольку продажи игр для них находятся в минимуме и уже не вырастут.

Рекламную кампанию проводить:

  • в Северной Америке, Европе и остальных регионах (кроме Японии) для игр жанров экшен и шутер, а также ролевых и спортивных игр, запускаемых на платформах Sony PlayStation 4, Microsoft Xbox One и Nintendo 3DS и имеющих рейтинговую категорию ESRB;
  • в Японии для ролевых игр и экшенов, запускаемых на платформах Nintendo 3DS, Sony PlayStation Vita и Sony PlayStation 4, как имеющих рейтинг ESRB, так и без него.